查找文件夹中每个文本文件中包含匹配模式的最后5行

时间:2017-09-30 08:39:53

标签: regex linux unix

我是一个Unix新手,并且一直试图绕过这一项任务很长一段时间。 如果有人可以帮助我会很棒。

问题 - 我需要遍历一个文件夹,进入每个.txt文件,然后获取具有特定单词的最后5行(例如:test)

我正在尝试遍历文件夹,进入每个文件,然后打印最后5行,其中包含单词' test'已经发生了。

例如

- 如果单词' test'在第1,3,5,7,9,12,14,15行中找到。 那么我只需要打印第7,9,12,14,15行的整行(即最后5行出现这个词)

我在某种程度上无法在我的问题中上传图片,但我希望此信息有助于: 文件1 - [这里有7个单词test的出现,我只需要最后5个] 文件2 - [这里有6个单词test的出现,我只需要最后5个]

我发现的命令是: cd到文件夹路径:

find . -type f -exec grep -iH "test" {} + | tail -n5; tail -n0 | grep -i test

此命令有效但打印最后5行然后退出。 它没有进入另一个文件。(因为它已经找到了最后5行的匹配单词)

在我的情况下,我希望输出是'每个'的最后5行。文件。

有人可以帮忙。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

第一个问题:

您无法在find命令的exec部分中使用管道。作为一种解决方法,你可以在exec部分内部启动一个shell,它接受一个现在可以包含管道的命令。

要让新启动的shell知道命令的开始和结束位置,只需使用单引号。

  

我需要遍历一个文件夹,进入每个.txt

find . -name '*.txt'
  

单词' test'已经发生了。

find . -name '*.txt' -exec grep "test" {} \;
  

并打印最后5行

好的,这里我们需要在find的exec部分内启动另一个shell:

find . -name '*.txt' -exec sh -c 'grep "test" {} | tail -n5 ' \;

答案 1 :(得分:0)

使用UNIX工具,您可以:

tac file | grep -m5 PATTERN 

要将此与find结合使用,您需要执行shell,因为tac和grep之间存在管道:

find . -type f -exec bash -c 'tac "${1}" | grep -m5 PATTERN' -- {} \;