[英]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而不是解析ls ,例如
#!/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.