我得到了一个带有类似模式的文件:
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行具有数字和点匹配,并且分别使用7
,9
,8
(按此顺序)完成。
输出记录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