sed用于模式匹配删除下面的行直到大括号或模式匹配

时间:2015-12-01 15:35:12

标签: regex awk sed

我有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相关的行。

3 个答案:

答案 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。