首页 > 解决方案 > 使用 sed 从配置文件中提取某些字符串

问题描述

我正在尝试从下面的输出中导出某些字符串,但是我没有使用 sed/awk 的经验,我需要一些建议我该如何继续。

输入:

name Cleartext-Password := "password", Service-Type := Framed-User
    Framed-IP-Address := 127.0.0.1,
    MS-Primary-DNS-Server := 8.8.8.8,
    Fall-Through = Yes,
    Mikrotik-Rate-Limit = 20M/30M

输出应该是:名称;密码;127.0.0.1;20M;30M;

我不确定这是否是正确的方法,但我试图删除所需字符串之间的所有内容,例如:

sed 's/ Cleartext-Password := "/;/' 

但是我认为这是一种肮脏的方式,而不是聪明的方式。

您能否让我知道我需要寻找什么才能为此创建有效的 sed/awk 解决方案?

标签: stringawksed

解决方案


您能否根据您显示的示例尝试以下操作。在站点https://ideone.com/eWXv3w中对其进行编写和测试

由于 OP 的 Input_file 具有控制 M 字符,因此 gsub(/\r/,"")在此处添加了代码。

awk '
BEGIN{ OFS=";" }
{ gsub(/\r/,"") }
match($0,/Cleartext-Password[^,]*/){
  val=substr($0,RSTART,RLENGTH)
  gsub(/Cleartext-Password[^"]*|"/,"",val)
  val=$1 OFS val
  next
}
/Framed-IP-Address/{
  sub(/,$/,"")
  val=val OFS $NF
  next
}
/Mikrotik-Rate-Limit/{
  print val, $NF
  val=""
}' Input_file

说明:BEGIN程序设置部分OFS按问题设置为分号。然后使用matchawk 的函数来匹配字符串 Cleartext 中的正则表达式...Cleartext-Password[^,]*直到第一个逗号出现。如果正则表达式完美匹配,则在此处在变量 val 中捕获该子字符串。现在gsub用于根据所需的输出全局替换 Cleartext-Password 中的所有内容以及所有不必要的内容。

然后检查是否行包含Framed-IP-Address是否找到然后,从最后一行发送替换并将该行最后一个字段添加到变量 val 此处。

现在检查条件是否一行包含Mikrotik-Rate-Limit然后在这里简单地打印 val 和最后一个字段的值,在这里也使 val 无效。


推荐阅读