Bash 多行grep

Bash 多行grep,bash,filter,grep,cygwin,Bash,Filter,Grep,Cygwin,我得到了一个模式如下的文件: 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->9->8->7->9->8->7->9->8->7->9->8。。。最后 我想得到这个模式不同的行。例如7->8->9: 172.18.0.7 172.18.0.8 172

我得到了一个模式如下的文件:

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->9->8->7->9->8->7->9->8->7->9->8。。。最后

我想得到这个模式不同的行。例如
7->8->9

172.18.0.7
172.18.0.8
172.18.0.9
由于文件有大约100000行,我想用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
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 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
以查找两个集合,但这将允许最后一行以结尾

172.18.0.8_and_more_characters
看起来像是死锁,但您可以将输入修改为Windows样式并匹配smart:

 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

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
以查找两个集合,但这将允许最后一行以结尾

172.18.0.8_and_more_characters
看起来像是死锁,但您可以将输入修改为Windows样式并匹配smart:

 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

不清楚,请确实提及您的样本的更多细节,然后让我们知道。不清楚,请确实提及您的样本的更多细节,然后让我们知道。当OP只想查看最后一位数字以控制匹配时,解决方案是正确的,当OP还想查找像
special172.18.0.7
这样的行时,
111.11.1.7
172.18.0.888888
作为一个不同的模式,您的解决方案需要一些改进。当OP只想查找最后一位数字来控制匹配时,解决方案是正确的,而OP也想查找类似
special172.18.0.7
这样的行,
111.11.1.7
172.18.0.888888
作为一种不同的模式,您的解决方案需要一些改进。