簡體   English   中英

Bash-嘗試讀取多個文件並根據行進行打印

[英]Bash - trying to read multiple files and print based on line

所以這是我的代碼,幾乎可以正常運行,但是在應該運行時不會停止。

function quit {
     exit
}
     for file in `ls /var/tmp/animals/ | grep -v animals`
       do
         cat $file | awk '/foo/ { print "OK" } !/foo/ { print "NOK"}'

     done
quit    

它讀取目錄/ var / tmp / animals中的文件,如果文件污染了foo,則在行上打印OK(如果沒有),則在行上打印NOK。

它可以正常工作的目錄中的4個文件,但它不會停止,並繼續隨機打印20行以上的NOK和OK。 目錄中只有4個文件。 誰能提供任何有關為什么發生這種情況的見解?

發生這種情況是因為awk對每一行運行一次表達式,而不對每個文件運行一次。 解決方法是這里。

您需要替換此行:

cat $file | awk '/foo/ { print "OK" } !/foo/ { print "NOK"}'

grep -l "foo" $file >/dev/null && echo "OK" || echo  "NOK"

只需一行即可輕松完成此操作

find /var/tmp/animals/ -maxdepth 1 -mindepth 1 -type f -not -name '*animal*' -exec bash -c 'grep -q "foo" "$0" && echo "OK" || echo "NOK" ' {} \;

而且,如果要使用for循環,請使用bash通配符globing而不是解析 ,例如

#!/bin/bash
for file in /var/tmp/animals/*; do
  if [[ -f $file && $file != *animal* ]]; then
    grep -q "foo" "$file" && echo "OK" || echo "NOK"
  fi
done

具體來說,您的方法行不通的原因是它正在測試每一行,而不是每個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM