我有一个文件,其中包含以下行:
/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
好消息!Awk字段分隔符可以是正则表达式。你只需要使用-F"<separator1>|<separator2>|…”:
awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file
返回:
tc0001 tomcat7.1 demo.example.com
tc0001 tomcat7.2 quest.example.com
tc0001 tomcat7.5 www.example.com
在这里:
-F"/|="将输入字段分隔符设置为非此即彼。
-vOFS='\t'使用-v标志来设置变量。OFS是输出字段分隔符的默认变量,它被设置为制表符。这个标志是必要的,因为OFS没有像-F这样的内置标志。
{print $3, $5, $NF}根据输入字段分隔符打印第3、5和最后一个字段。
请看另一个例子:
$ cat file
hello#how_are_you
i#am_very#well_thank#you
这个文件有两个字段分隔符,#和_。如果我们想打印第二个字段,而不管分隔符是一个还是另一个,让我们让两个都是分隔符!
$ awk -F"#|_" '{print $2}' file
how
am
其中文件编号如下:
hello#how_are_you i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^ ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
1 2 3 4 1 2 3 4 5 6