Regex 在文件夹中的每个文本文件中查找包含匹配模式的最后5行
我是一个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到文件夹路径: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次单词测试,我
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 ' \;