删除空行包围的行

时间:2013-04-10 21:01:55

标签: linux sed awk

基本上,我有来自nmap的输出,它给了我一个IP,然后是一个打开端口列表,然后是一个空白行。我已经过滤掉了我不再需要的端口(例如grep -v http),但我无法弄清楚如何删除没有以下端口的IP地址。

有没有办法用sed做到这一点?

示例数据:

Nmap scan report for 1.1.1.1
3389/tcp  open  ms-term-serv
5357/tcp  open  unknown
5432/tcp  open  postgresql
8080/tcp  open  http-proxy
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown

Nmap scan report for 2.2.2.2

Nmap scan report for 3.3.3.3
80/tcp    open  http
443/tcp   open  https
6646/tcp  open  unknown
8000/tcp  open  http-alt
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49156/tcp open  unknown
49157/tcp open  unknown

3 个答案:

答案 0 :(得分:1)

以下awk代码段为我创建了我创建的虚构文件:

22.22.22.22
dflkhhdfjhdk
tslkdkffhdskjgh

33.33.33.33
tddfgkghdfkj

44.44.44.44

55.55.55.55
ghdkjghdkfjhjdfhg
iuryweiu
kjwhkjfh

66.66.66.66

77.77.77.77
cxlvbclbnc

并通过以下awk程序运行此程序:

awk '/[0-9][0-9].[0-9][0-9].[0-9][0-9].[0-9][0-9]/ { K=$0; next }
K { if(length) print K "\n" $0; K=""; next }
1
END { if(K) print K }' infile > outfile

之后outfile的内容如下:

22.22.22.22
dflkhhdfjhdk
tslkdkffhdskjgh

33.33.33.33
tddfgkghdfkj

55.55.55.55
ghdkjghdkfjhjdfhg
iuryweiu
kjwhkjfh

77.77.77.77
cxlvbclbnc

我用来匹配IP地址的正则表达式需要修改以匹配您的特定情况,但我认为您已经覆盖了它。

希望这会有所帮助。我知道它不是sed但我认为足够接近。

答案 1 :(得分:1)

使用awk,您只需执行awk '$2' ORS='\n\n' FS='\n' RS= file

$ awk '$2' ORS='\n\n' FS='\n' RS= file
Nmap scan report for 1.1.1.1
3389/tcp  open  ms-term-serv
5357/tcp  open  unknown
5432/tcp  open  postgresql
8080/tcp  open  http-proxy
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown

Nmap scan report for 3.3.3.3
80/tcp    open  http
443/tcp   open  https
6646/tcp  open  unknown
8000/tcp  open  http-alt
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49156/tcp open  unknown
49157/tcp open  unknown

如果在前一个脚本中添加到文件末尾的额外换行是个问题,那么请使用以下替代方法:

awk '/^Nmap/{h=$0;i=NR;next}NR==i+1{if($0){print h;p=1}else p=0}p' file

答案 2 :(得分:0)

sed

非常简单
sed '$!N;/\n$/d' filename

或者如果您想要更改文件:

sed -i '' '$!N;/\n$/d' filename