AWK多个分隔符

时间:2012-08-30 19:35:39

标签: linux awk

我有一个包含以下行的文件:

/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

如何使用'='之后的域名提取最后一个字段?如何使用multiple delimiter提取字段?

7 个答案:

答案 0 :(得分:280)

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

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

答案 1 :(得分:29)

好消息! awk字段分隔符可以是正则表达式。您只需使用-F"<separator1>|<separator2>|..."

awk -F"/|=" '{print $3, $5, $NF}' file

返回:

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

下面:

  • -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

答案 2 :(得分:5)

如果您的空白是一致的,您可以将其用作分隔符,而不是直接插入\t,您可以设置输出分隔符,它将自动包含在其中:

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

答案 3 :(得分:4)

另一种方法是使用-F选项,但将其传递给正则表达式以在左右括号()之间打印文本。

文件内容:

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

答案 4 :(得分:3)

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

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

我确信使用()和参数

存在变体

答案 5 :(得分:2)

Perl one-liner:

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

使用以下命令行选项:

  • -n循环输入文件的每一行,将该行放在$_变量中,不自动打印每一行

  • -l在处理之前删除换行符,然后将其添加回来

  • -a autosplit模式 - perl会自动将输入行拆分为@F数组。默认为在空格上拆分

  • -F autosplit修饰符,在此示例中分为/=

  • -e执行perl代码

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

答案 6 :(得分:0)

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

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'