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

所以它的7-> 9-> 8-> 7-> 7-> 9-> 8-> 7-> 7-> 9-> 8-> 8-> 7-> 7-> 9-> 8-> 8-> 7-> 7-> 9-> 9-> 8 ..。

我想获取该模式不同的行。例如。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.]+7n[0-9.]+9n[0-9.]+8n' NF file

设置了记录分隔符RS,以使其与3行具有数字和点匹配,并且分别使用798(按此顺序)完成。

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

gnu sed 4.2支持 -z

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

当您的三个电势集的第一行就像

时,此解决方案将失败
some_other_chars_before_172.18.0.7

当您在比赛开始时添加n时,您需要删除最后的n才能找到2集,而没有任何内容,但这将允许最后一行以

结束
172.18.0.8_and_more_characters

它看起来像是僵局,但是您可以修改对Windows样式的输入并匹配Smart:

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

最新更新