我浏览了StackExchange网站,但没有找到任何我想要的东西。以下是grep的两个用例:
- 在比赛前/比赛后打印项目
- 打印某个匹配项
我正在尝试解析一个日志文件,我想返回日志中的最后一个错误,可以预见,它位于文件的末尾。然而,有时错误是多行。"如何在最后一场比赛中获胜"的答案都涉及尾巴或头部,并且只适用于一行。
在我的情况下,我只想返回文件中的所有内容,以最后一个匹配开始。通常情况下,这最多不会超过10-15行,因此grep -A 15
可以做到这一点。但是,我仍然只需要得到其中的最后一个,所以单凭这一点并不能产生正确的输出。
天真的方法是使用两部分的比赛,首先了解最后一场比赛是什么,然后了解之后的一切。这对我不起作用,因为我不能保证最后一场比赛是独一无二的。
有没有可能用grep以某种方式做到这一点,或者有更好的工具吗?
有一种方法可以让sed
做到这一点,但我记不清了。
如果你对使用命令组合持开放态度,这里有一些可能有效的东西:
# Get the line number of teh last match
LNO=$( grep -n 'the error' the_file | tail -1 | cut -d":" -f1 )
# Now use sed to print all lines from that point:
sed -n "$LNO,$p" the_file
我认为某个地方有一个完全重复的地方,但我只找到了这些接近的地方:
- 如何获取从最后一个匹配到文件末尾的行
- grep最后一场比赛和它';s下列行
这里有一种方法:
$ cat ip.txt
foo123
error 1
xyz
error 2
99999
88888
$ tac ip.txt | sed '/error/q' | tac
error 2
99999
88888