多行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行数字和点,分别以7
、9
、8
结束(在此订单)。
输出记录 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
我得到了一个架构如下的文件:
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行数字和点,分别以7
、9
、8
结束(在此订单)。
输出记录 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