grep命令在多个文件中search一个模式并列出按datesorting的文件

我有一个要求在多个文件中search一个模式,并获得最新的文件进行进一步处理。 我正在尝试在shell脚本中执行此操作。 我正在尝试如下

file=`grep -lh <pattern> <file_name> | tail -1` 

但grep列出的文件在ls而不是在ls -lrt 。 我已经尝试了下面的命令

 ls -lrt `grep -l <pattern> <file name>` 

但是我不能将这个命令合并到shell脚本中。 任何帮助表示赞赏。

谢谢

快得多。 而另一个回答grep 所有的文件,这将search最新的一个,并立即停止,一旦发现模式。

这一行代码将结果捕获到一个variables中:

 file=$(while read file; do grep pattern "$file" >/dev/null;[[ $? ]]; then echo "$file"; break; fi; done < <(find $startdir -maxdepth 1 -type f -printf "%T@:%p\n"|sort -nr|cut -d: -f2-)) 

这是一个更容易阅读的Bash脚本版本:

 #!/bin/bash while read file do grep pattern "$file" > /dev/null if [[ $? ]] then echo "$file" break fi done < <(find $startdir -maxdepth 1 -type f -printf "%T@:%p\n" | sort -nr | cut -d: -f2-) 

您可以将grep的输出传递给xargs以在通过尾部pipe道之前使用ls -lrt

这应该做到这一点:

 ls -lrt|awk '{print $9}'|xargs -n1 grep <string>|tail -n1|awk '{print $1}' 

您可能需要更改awk中的哪些variables,这取决于您的ls和grep的实现。

基本上,首先对文件进行sorting,然后查找string,然后获取最后的结果。

 bluerain ~ # ls -lrt `grep -la *.sh ` -rwxr-xr-x 1 root root 315 2007-01-20 17:43 twopass.sh -rwxr-xr-x 1 root root 86 2007-04-21 16:23 hd_down.sh -rwxr-xr-x 1 root root 245 2009-09-10 19:47 pspenc.sh -rwxr--r-- 1 root root 95 2009-09-10 19:50 psp2.sh bluerain ~ # kk=`grep -la *.sh` bluerain ~ # bb=` ls -rt $kk | tail -1` bluerain ~ # echo $bb psp2.sh bluerain ~ # echo $kk hd_down.sh psp2.sh pspenc.sh twopass.sh 

所以使用以下内容:

 tempvar=`grep -l <pattern> *(for all files in the directory)` file=`ls -rt $tempvar | tail 1` 

在你的第一个例子中, grep不应该重新排列你传递给它的文件名。 如果您明确地传递它们,它将以与传递文件列表相同的顺序打印输出。 但是,如果你传递一个通配符,那么你的shell会按照词法顺序来扩展这个通配符(这正如你所说的那样,这基本上是默认的)。

看了其他build议后,我提供以下内容:

 file=`ls -t --quoting-style=shell "dir" | xargs grep -l "regex" | head -n 1` 

我认为这符合你的要求,并解决其他人提出的问题如下:

  1. 你可以不使用-l来使用ls -t ,所以不需要用awk来parsingls -l的输出,或者只是为了得到文件名而cut
  2. 不要颠倒ls的排列顺序。 使用ls -t将最新的文件放在第一位,抓住第一个文件head就会在find第一个匹配的文件(因此您searchfind匹配所需的最小文件列表)时立即将stream水线短路。
  3. xargspipe道有效地允许您search无限数量的文件,而不会遇到最大命令行长度,并且不会循环。
  4. 根据需要使用ls --quoting-style=shell引号将文件名用单引号括起来,因此可以正确处理带embedded空格或控制字符的文件名。

请注意--quoting-style是一个GNU扩展,不可能与非GNU ls一起工作。 你应该在Linux上很好。 以下是更加便携,但增加了一个电话给sed引用文件名,所以有更多的开销:

 file=`ls -t "dir" | sed 's/\(.*\)/"\1"/' | xargs grep -l "regex" | head -n 1`