一切都在标题中。基本上可以说我有这种模式
some text lalala
another line
much funny wow grep
我grep好笑,我希望我的输出是“lalala”
谢谢
最佳答案
一种可能的答案是使用ed
或ex
做到这一点(在它们中是微不足道的):
ed - yourfile <<< 'g/funny/.-2p'
(或将
ed
替换为ex
。您可能也拥有受限编辑器red
;它无法修改文件。)这会全局查找/funny/
模式,只要找到它,就在匹配行之前打印第2行(即.-2p
部分)。或者,如果您希望在与“funny”匹配的行之前包含“lalala”的最新行:ed - yourfile <<< 'g/funny/?lalala?p'
唯一的问题是,如果您要处理标准输入而不是文件;那么您必须将标准输入保存到文件中并处理该文件,这会破坏并发性。
您无法在
sed
中做负偏移量(尽管GNU sed
允许您做正偏移量,因此您可以根据发现'使用sed -n '/lalala/,+2p' file
将'lalala'变成'funny'行(这并不是您想要的) lalala”,但您无法基于查找“funny”来找到“lalala”行)。标准sed
根本不允许使用偏移量。如果您只需要打印在模式匹配行之前的第8行找到的IP地址,则需要稍微复杂一些的
ed
脚本,但是它仍然可行:ed - yourfile <<< 'g/funny/.-8s/.* //p'
这使用相同的基 native 制来找到正确的行,然后运行替代命令以删除行中最后一行的所有内容并打印修改后的版本。由于没有
w
命令,因此它实际上并未修改文件。关于linux - 如何执行grep -B之类的操作仅选择一行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25171304/