string - 使用 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 解决方案?
解决方案
您能否根据您显示的示例尝试以下操作。在站点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
按问题设置为分号。然后使用match
awk 的函数来匹配字符串 Cleartext 中的正则表达式...Cleartext-Password[^,]*
直到第一个逗号出现。如果正则表达式完美匹配,则在此处在变量 val 中捕获该子字符串。现在gsub
用于根据所需的输出全局替换 Cleartext-Password 中的所有内容以及所有不必要的内容。
然后检查是否行包含Framed-IP-Address
是否找到然后,
从最后一行发送替换并将该行最后一个字段添加到变量 val 此处。
现在检查条件是否一行包含Mikrotik-Rate-Limit
然后在这里简单地打印 val 和最后一个字段的值,在这里也使 val 无效。
推荐阅读
- javascript - 如何让一个栏出现在链接下方?
- flutter - 未来不是一种类型。尝试更正名称以匹配现有类型。dartnot_a_type
- wordpress - 将参数附加到 URL 以解决页面缓存和税收切换问题
- java - 如何更改 GUI 中标题边框的颜色?
- json - 当我在 laravel 5.8 中以 json 格式发送数据时,我通过 axios 接收它们,但 v-for 在 vue 模板中没有显示任何内容
- javascript - 当输入数组在循环中呈现时,输入标记在反应中不允许输入多个字符
- php - 每种分辨率的字体变化
- php - 如何将 URL 与 PHP 项目的目录结构映射
- python - 如何从 multiprocessing.Process 获取函数返回值?
- c - 为什么我的代码在调试时运行但当我按下构建并运行时它崩溃?