从grep搜索多个文件中获取最后一行,并将它们写入输出文件

时间:2019-05-02 17:34:15

标签: linux bash

我在多个目录中有多个文件。我从他们那里搜索grep的关键字“能源”。在每个文件中,我有多个匹配案例。我想从每个文件中获取最后一行并将结果保存在output.txt文件中。我写了以下代码:

labl=SubDir
ENERGY=`grep 'ENERGY' MyDir*${labl}*/*.txt`

cat > output.txt << EOF

${ENERGY}

EOF

此代码保存每个文件中的所有匹配案例。但是如上所述,我需要每个文件的最后一个匹配大小写。为此,我将grep命令修改为:

ENERGY=`grep 'ENERGY' MyDir*${labl}*/*.txt|taile -l`

不幸的是,这也不起作用。而是只保存最后一个文件中的所有匹配项。

如何解决?

3 个答案:

答案 0 :(得分:2)

请不要运行多个进程/管道来实现此目的。

 gawk '/ENERGY/{last=$0} ENDFILE{if(last!="") print last; last=""}' MyDir*"$labl"*/*.txt
  • /ENERGY/{last=$0}:在与正则表达式ENERGY匹配的行上,将变量last设置为整行$0

  • ENDFILE{...}在全局文件提供的每个输入文件的末尾运行此{action}

  • if(last!="") print last:如果不为空,则打印last

  • last="":将此变量重置为null,避免重复

  • MyDir*"${labl}"*/*.txt:glob中带引号的变量将匹配包含空格的目录名称

答案 1 :(得分:0)

使用for循环:

for f in MyDir*"$lab1"*/*.txt; do
   grep ENERGY "$f" | tail -1 >> output.txt
done

答案 2 :(得分:0)

然而,但并非最后一种可能的方法是使用类似的并行方法。也许您可以使用xargs达到相同的效果,但是我个人更喜欢使用parallel,因为它更简单,并且可以扩展您的过程。

ls -1 file* | parallel -j1 "grep ENERGY {} | tail -n 1" > output.txt