Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在文件夹中的每个文本文件中查找包含匹配模式的最后5行_Regex_Linux_Unix - Fatal编程技术网

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

Regex 在文件夹中的每个文本文件中查找包含匹配模式的最后5行,regex,linux,unix,Regex,Linux,Unix,我是一个Unix新手,已经尝试绕过这一任务很长一段时间了。 如果有人能帮我就好了 问题-我需要循环遍历一个文件夹,进入每个.txt文件,然后获取最后5行有特定单词的内容(例如:test) 我正在尝试遍历文件夹,进入每个文件,并打印出现单词“test”的最后5行 例如,如果在行号1、3、5、7、9、12、14、15中发现“测试”一词。 然后我只需要在第7、9、12、14、15行打印整行(即最后5行出现此单词) 在我的问题中,我无法上传图像,但我希望这些信息有帮助: 文件1-[这里有7次单词测试,我

我是一个Unix新手,已经尝试绕过这一任务很长一段时间了。 如果有人能帮我就好了

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

我正在尝试遍历文件夹,进入每个文件,并打印出现单词“test”的最后5行

例如,如果在行号1、3、5、7、9、12、14、15中发现“测试”一词。 然后我只需要在第7、9、12、14、15行打印整行(即最后5行出现此单词)

在我的问题中,我无法上传图像,但我希望这些信息有帮助: 文件1-[这里有7次单词测试,我只需要最后5次] 文件2-[这里有6个单词测试,我只需要最后5个]

我想出的命令是: cd到文件夹路径:

find . -type f -exec grep -iH "test" {} + | tail -n5; tail -n0 | grep -i test
此命令有效,但它打印最后5行,然后退出。 它不会进入另一个文件。(因为它已经找到了最后5行匹配的单词)

然而,在我的例子中,我希望输出是“每个”文件的最后5行

有人能帮忙吗。
提前感谢您。

使用UNIX工具,您可以:

tac file | grep -m5 PATTERN 
要将其与
find
结合起来,您需要执行一个shell,因为tac和grep之间有管道:

find . -type f -exec bash -c 'tac "${1}" | grep -m5 PATTERN' -- {} \;
第一个问题:

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

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

我需要循环通过一个文件夹,进入每个.txt文件

出现“test”一词的位置

并打印最后5行

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

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

我看不到您的附件,您应该在问题中提供信息。您是否查找最后五行中每行都包含特定单词的文件?或者最后五行中至少有一行包含它的文本文件。谢谢你的回复。我试图从EOF中找到单词出现的最后5行。例如,如果在行号1、3、5、7、9、12、14、15中发现“测试”一词。然后我只需要在第7、9、12、14、15行打印整行(即出现该单词的最后5行)
grep-m
在5次匹配后停止。我认为OP想在5行之后停止,但OP还没有回答我的问题评论。好吧,OP说,然后取出最后5行有特定单词的单词(例如:test)。这让我觉得
grep-m5
是合适的。啊,我认为你是对的,它匹配了OP编码尝试的一部分:grep,然后是tail-n5。不过,我的品味需要太多的猜测。但这不是你的错,你有一个很好的答案来猜测问题是什么。你好,hek2mgl。我尝试了你的命令,但不幸的是我的系统中没有tac。如果你能用Sed/Awk/Tail命令帮助我,那就太好了。你可以安装它。它属于GNU coreutils。否则,@Klaus的答案应该有效。
find . -name '*.txt' -exec grep "test" {} \;
find . -name '*.txt' -exec sh -c 'grep "test" {} | tail -n5 ' \;