我有一个文件,其中包含以下行:

/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

其他回答

Perl一行程序:

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

使用这些命令行选项:

-n循环输入文件的每一行,把行放在$_变量中,不自动打印每一行 -l在处理之前删除换行符,并在处理之后将它们添加回去 -a autosplit mode - perl会自动将输入行分割到@F数组中。默认为空格分割 -F autosplit修饰符,在这个例子中,在/ or =上进行分割 -e执行perl代码

Perl与awk密切相关,但是,@F自动拆分数组从索引$F[0]开始,而awk字段以$1开始。

分隔符可以是正则表达式。

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

生产:

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

如果你的空格是一致的,你可以使用它作为分隔符,也不是直接插入\t,你可以设置输出分隔符,它将自动包含:

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

对于任何数字2到5或字母a或#或空格的字段分隔符,其中分隔字符必须至少重复2次,不超过6次,例如:

awk -F'[2-5a# ]{2,6}' ...

我确信使用()和参数存在这种变化

我看到黑板上有很多完美的答案,但我仍然想上传我的代码,

awk - f”/“{打印3”“5美元 " " $ 7}‘山姆| sed’s /猫。* = / / g’