Bash - 尝试读取多个文件并根据行打印



所以我的代码几乎可以工作,但不会在应该停止的时候停止。

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 通配符通配符而不是解析 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

具体来说,您的方式不起作用的原因是它正在测试每一行,而不是每个文件。

相关内容

  • 没有找到相关文章

最新更新