如果不存在匹配的行,则使用bash删除行

时间:2016-01-26 16:37:19

标签: linux bash sed

我从HP在线管理员输出,显示刀片托架编号和其他一些信息。我想删除不包含托架数据的行。以下是我的示例文件:

Bay 1
enc01(111.11.111.1) - Server Name: hostname1.example.com
MGMT IP Address: 192.168.0.1
Bay 2
enc01(111.11.111.1) - Server Name: hostname2.example.com
MGMT IP Address: 192.168.0.2
Bay 3
enc01(111.11.111.1) - Server Name: hostname3.example.com
MGMT IP Address: 192.168.0.3
Bay 4
enc01(111.11.111.1) - Server Name: hostname4.example.com
MGMT IP Address: 192.168.0.4
Bay 5
Bay 6
Bay 7
enc01(111.11.111.1) - Server Name: hostname7.example.com
MGMT IP Address: 192.168.0.7
Bay 8
enc01(111.11.111.1) - Server Name: hostname8.example.com
MGMT IP Address: 192.168.0.8
Bay 9
enc01(111.11.111.1) - Server Name: hostname9.example.com
MGMT IP Address: 192.168.0.9
Bay 10
Bay 11
enc01(111.11.111.1) - Server Name: hostname11.example.com
MGMT IP Address: 192.168.0.11
Bay 12
Bay 13
Bay 14
Bay 15
Bay 16

我想删除enc01(111.11.111.1)行不在下面的所有Bay行。所以,我想删除:

Bay 5
Bay 6
Bay 10
Bay 12
Bay 13
Bay 14
Bay 15
Bay 16

从列表中,因为在这些托架下方,没有要列出的刀片。这些是完全随机的,有些机箱将有更多的空托架,其他的,所以它必须是动态的。

如果可能,我想使用sed。我也在使用Red Hat Enterprise Linux 6.6。

谢谢! 乔

2 个答案:

答案 0 :(得分:3)

使用awk即可:

awk '/enc01\(111\.11\.111\.1\)/{print p; print} /^Bay/{p=$0}' file
Bay 1
enc01(111.11.111.1) - Server Name: hostname1.example.com
Bay 2
enc01(111.11.111.1) - Server Name: hostname2.example.com
Bay 3
enc01(111.11.111.1) - Server Name: hostname3.example.com
Bay 4
enc01(111.11.111.1) - Server Name: hostname4.example.com
Bay 7
enc01(111.11.111.1) - Server Name: hostname7.example.com
Bay 8
enc01(111.11.111.1) - Server Name: hostname8.example.com
Bay 9
enc01(111.11.111.1) - Server Name: hostname9.example.com
Bay 11
enc01(111.11.111.1) - Server Name: hostname11.example.com

答案 1 :(得分:0)

虽然我更喜欢 @anubhava 回答,但使用GNU grep可以执行此操作:

grep -A1 -B1 'enc01(111\.11\.111\.1)' input_file

请注意,它会在连续的匹配组之间放置一个包含组分隔符( - )的行。