使用换行符分隔符提取数据包

时间:2014-07-21 10:04:14

标签: shell unix awk

我有下面的文件说" 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选项。

2 个答案:

答案 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 awkgawk)解决方案;它只需要一个简单的调整就可以使它成为 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成语,它将输入分隔为空行记录,以便每条记录包含的运行连续的非空行