我从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。
谢谢! 乔
答案 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
请注意,它会在连续的匹配组之间放置一个包含组分隔符( - )的行。