我有一个文件,其中包含以下行:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
在上面的输出中,我想提取3个字段(数字2,4和最后一个*.example.com)。我得到以下输出:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
我如何也提取域名后的最后一个字段'='?我如何使用多个分隔符提取字段?
另一种方法是使用-F选项,但将其传递给regex以打印左右括号()之间的文本。
文件内容:
528(smbw)
529(smbt)
530(smbn)
10115(smbs)
命令:
awk -F"[()]" '{print $2}' filename
结果:
smbw
smbt
smbn
smbs
使用awk打印[]之间的文本:
使用awk - f[][]但awk - f '[[]] '不会工作。
http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
使用Raku(以前称为Perl_6)
raku -ne '.split(/ <[/=]> /).[2,4,7].put;'
样例输入:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
样例输出:
tc0001 tomcat7.1 demo.example.com
tc0001 tomcat7.2 quest.example.com
tc0001 tomcat7.5 www.example.com
上面是一个用Raku编写的解决方案,Raku是perl编程语言家族的一个成员。简单地说,在read中按行输入-ne(按行,非自动打印)命令行标志。行在正则表达式上被分割,正则表达式由一个自定义字符类(/=)组成,使用<[]>操作符创建。然后放入元素[2,4,7]得到上述结果。
当然,上面是一个“基本的”实现,Raku是一种perl家族语言,因此可以应用TMTOWTDI。因此,行可以用|“OR”操作符分隔的文字字符进行分割。在split例程中添加:skip-empty副词可以收紧元素编号(在Perl和Raku中都是零索引)。空格可以从每个元素中删除(使用map),所需的元素(现在是[1,3,6])与\t制表符连接,给出以下结果:
raku -ne '.split(/ "/" | "=" /, :skip-empty).map(*.trim).[1,3,6].join("\t").put;' file
tc0001 tomcat7.1 demo.example.com
tc0001 tomcat7.2 quest.example.com
tc0001 tomcat7.5 www.example.com
https://raku.org
另一种方法是使用-F选项,但将其传递给regex以打印左右括号()之间的文本。
文件内容:
528(smbw)
529(smbt)
530(smbn)
10115(smbs)
命令:
awk -F"[()]" '{print $2}' filename
结果:
smbw
smbt
smbn
smbs
使用awk打印[]之间的文本:
使用awk - f[][]但awk - f '[[]] '不会工作。
http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html