我有下面的文件说" Main.cap"在unix中 -
如果我想捕获来自特定IP的所有数据包,请说:1.1.1.1提供所有数据包的大小不同
Device:A
Host:B
IP:0.0.0.0
Time:123654
Location:India
Device:B
Host:C
IP:1.1.1.1
Time:125423
Device:C
Host:D
IP:1.1.1.1
Time:129423
Device:E
Host:F
IP:1.1.1.1
Time:125423
Location:Germany
Device:G
Host:H
IP:1.2.5.6
Time:12543
上述文件所需的输出如下 -
Device:B
Host:C
IP:1.1.1.1
Time:125423
Device:C
Host:D
IP:1.1.1.1
Time:129423
Device:E
Host:F
IP:1.1.1.1
Time:125423
Location:Germany
我正在尝试使用Awk RS选项。
答案 0 :(得分:3)
使用gawk
:
gawk 'BEGIN{ORS="\n\n";RS=""}/.*^IP:1\.1\.1\.1$.*/' file
或任何awk
:
awk -v ip=1.1.1.1 'BEGIN { ORS="\n\n"; RS = ""; FS = "\n" } { for (i = 1; i <= NF; ++i) if ($i == "IP:" ip) { print; next } }' file
输出:
Device:B
Host:C
IP:1.1.1.1
Time:125423
Device:C
Host:D
IP:1.1.1.1
Time:129423
Device:E
Host:F
IP:1.1.1.1
Time:125423
Location:Germany
答案 1 :(得分:1)
@konsolebox's answer包含优雅的GNU awk
(gawk
)解决方案;它只需要一个简单的调整就可以使它成为 POSIX兼容的解决方案:
awk -v RS='' -v ORS='\n\n' '/\nIP:1\.1\.1\.1\n/' file
将IP地址作为变量传递:
awk -v RS='' -v ORS='\n\n' -v ip='1.1.1.1' '$0 ~ "\nIP:"ip"\n"' file
请注意,将RS
(输入记录分隔符)设置为空字符串是一个awk
成语,它将输入分隔为空行记录,以便每条记录包含的运行连续的非空行。