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来提取字段? 
分隔符可以是正则expression式。
 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 
 好消息!  awk字段分隔符可以是正则expression式。 您只需使用-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="/|="将input字段分隔符设置为/或=。 然后,它将输出字段分隔符设置为选项卡。
- 
{print $3, $5, $NF}根据input字段分隔符打印第三,第五和最后一个字段。
看另一个例子:
 $ cat file hello#how_are_you i#am_very#well_thank#you 
 这个文件有两个字段分隔符#和_ 。 如果我们想要打印第二个字段而不pipe分隔符是什么,那么让我们把它们都作为分隔符! 
 $ 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 
 如果你的空格是一致的,你可以使用它作为分隔符,而不是直接插入\t ,你可以设置输出分隔符,它会自动包含: 
 < file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}' 
Perl一行:
 perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file 
这些命令行选项被使用:
- 
-n循环input文件的每一行,将行放在$_variables中,不要自动打印每一行
- 
-l在处理之前删除换行符,然后将其添加回来
- 
-aautosplit模式 – perl会自动将input行分割成@F数组。 默认分割为空格
- 
-Fautosplit修饰符,在这个例子中分割为/或=
- 
-e执行Perl代码
  Perl与awk密切相关,但是@F autosplit数组从$F[0]开始,而awk字段以$ 1开头。 
 对于任何数字2到5的字段分隔符或字母a或#或空格,分隔字符必须重复至less2次且不超过6次,例如: 
 awk -F'[2-5a# ]{2,6}' ... 
我相信使用()和参数存在这种变化
我看到很多完美的答案都在板子上,但是仍然想上传我的一段代码,
 awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'