仅搜索文件的最后 n 行以匹配文本模式并打印没有此模式的文件名

Search only last n lines of a file for matching text pattern and print filenames that do not have this pattern

我想在一堆名称相似的文件的最后两行中搜索给定的文本模式,并写出 NOT 找到的文件名。

我试过这个:

tail -n 2 slurm-* | grep -L "run complete"

如您所见,"slurm" 是文件库,我想查找 "run complete" 不存在的文件。但是,此命令没有给我任何输出。我尝试了常规(非逆)问题:

tail -n 2 slurm-* | grep -H "run complete"

我得到一堆输出(找到的所有匹配项,但没有找到文件名):

(standard input):run complete

我想我误解了管道尾部输出到 grep 的工作原理,非常感谢任何帮助。

这应该有效 -

for file in `ls slurm-*`;
do
res=`tail -n2 $file | grep "run complete" 1>/dev/null 2>&1; echo $?`;
  if [ $res -ne 0 ];
  then
    echo $file ;
  fi ;
done ;

解释-

"echo $?" 为我们提供了 grep 命令的 return 代码。如果 grep 在文件中找到模式,它 returns 0。否则 return 代码是非零的。

我们检查此非零 return 代码,然后才检查 "echo" 文件名。由于您没有提到是否需要 grep 的输出,我已将 STD_OUT 和 STD_ERR 发送到 /dev/null.