我有dhcp.lease文件,其中包含以下行
lease 192.168.10.15 {
starts 1 2012/10/26 12:04:54;
ends 0 2013/01/24 12:04:54;
#shared-network: LAN
tstp 0 2013/01/24 12:04:54;
cltt 1 2012/10/26 12:04:54;
binding state active;
next binding state free;
hardware ethernet 64:a3:cb:44:d5:00;
uid "\001d\243\313@\333(";
client-hostname "iPhone56";
}
lease 192.168.10.104 {
starts 4 2012/08/13 05:20:36;
ends 5 2013/02/12 05:20:36;
#shared-network: LAN
tstp 5 2013/02/12 05:20:36;
cltt 4 2012/08/13 05:20:36;
binding state active;
next binding state free;
hardware ethernet 00:27:0e:08:60:88;
uid "\001\000\014)V\321\222";
client-hostname "ImageMachine";
}
我想删除带有192.168.10.15 ip地址和以下行的行,直到下一个租约到来意味着我想删除只使用sed或awk与该租约ip相关的行。
答案 0 :(得分:3)
这只需要直接使用sed
范围:
sed -e '/^lease 192.168.10.15 {$/,/^}$/d'
删除从lease
开始的行和IP地址以及打开的大括号到仅包含}
的下一行。
您也可以使用awk
:
awk '/^lease 192.168.10.15 {$/,/^\}$/ {next} {print}'
对于从一个开始lease
和IP地址以及开放式大括号到下一行仅包含'}'的行的范围,请执行{next}
跳转到下一行,无需打印 - 有效删除该行。所有其他行都获得{print}
的默认操作,也可以拼写为1
。
答案 1 :(得分:1)
您可以使用此命令:
sed '/192\.168\.10\.15 /{:a;N;/\}/d;ba}' file
细节:
/192\.168\.10\.15 / { # when the ip (+ a space to not match 151,152,...) is found
:a; # define the label "a"
N; # append the next line to the pattern space
/\}/d; # when a "}" is found, delete the pattern space
ba # otherwise, go to the label "a"
}
请注意,当sed执行delete命令d时,将擦除模式空间,并使用下一行重新启动代码。
(但Jonathan Leffler的剧本更简单!)
答案 2 :(得分:1)
awk
很简单:
awk '!/192\.168\.10\.15/' RS='}\n' ORS='}\n'
我正在使用}<newline>
作为输入和输出记录分隔符。我只需要检查当前记录是否包含感兴趣的IP。