多行grep

Multiple lines grep

我得到了一个架构如下的文件:

172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8

So its 7->9->8->7->9->8->7->9->8->7->9->8->7->9->8 ... at its end.

我想获取此架构不同的行。例如。 7->8->9:

172.18.0.7
172.18.0.8
172.18.0.9

由于文件有大约 100000 行,我想使用 grep 来过滤它们。

我试过这样的事情:

grep -Pzl "172.18.0.7*\n 172.18.0.9*\n 172.18.0.8*\n"

结果不正确。我想找到一个符合前面提到的架构的模式。

使用 GNU awk:

awk -v RS='\n*[0-9.]+7\n[0-9.]+9\n[0-9.]+8\n' NF file

设置记录分隔符RS,使其匹配3行数字和点,分别以798结束(在此订单)。

输出记录 ORS 分隔符(默认)\n,输入脚本(仅 NF)打印所有非空行(不匹配 RS).

GNU sed 4.2 支持 -z:

sed -z 's/172.18.0.7\n172.18.0.9\n172.18.0.8\n//g' file

当您可能的三行中的第一行是这样时,此解决方案将失败

some_other_chars_before_172.18.0.7

当你在比赛的开头添加 \n 时,你需要删除最后的 \n 以找到 2 组之间没有任何东西,但这将允许最后一行以

172.18.0.8_and_more_characters

看起来像个死锁,但你可以将你的输入修改为Windows样式并智能匹配:

 sed -rz 's/\n/\r\n/g;s/(\n|^)172.18.0.7\r\n172.18.0.9\r\n172.18.0.8\r//g;s/\r//g' file