AWK多个分隔符

Sat*_*ish 185 awk command-line text-processing

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

/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
Run Code Online (Sandbox Code Playgroud)

在上面的输出中,我想提取3个字段(第2,4和最后一个*.example.com).我得到以下输出:

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5
Run Code Online (Sandbox Code Playgroud)

如何提取具有以下域名的最后一个字段'='?我如何使用multiple delimiter提取字段?

emb*_*yle 302

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

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file
Run Code Online (Sandbox Code Playgroud)

生产:

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com
Run Code Online (Sandbox Code Playgroud)

  • 当然,不需要`cat`进程:`awk'...'file`.此外,使用输出字段分隔符会更整洁:`awk -F'[/ =]'-v OFS ="\ t"'{print $ 3,$ 5,$ 8}'` (39认同)
  • Awk分隔符可以是正则表达式...这使我的一天! (11认同)
  • @das.cyklone:awk也可以有几个分隔符,`|`:ex:`awk -F'this | that | [= /]''......'`(有用的是单词/字符串分隔(请注意,这会使fiels中的空格保持在2个分隔符之间.添加`| [\ t] +'可能很有用,但可能会让事情变得棘手......因为'this'之前和之后经常有空格,这将在空格和'this'之间出现2个额外的空字段 (3认同)
  • 是的......这让我得到了我想要的: awk -F"[ :]+" '/\/postmaster *$/ {print $5}' (3认同)

fed*_*qui 37

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

awk -F"/|=" '{print $3, $5, $NF}' file
Run Code Online (Sandbox Code Playgroud)

返回:

tc0001 tomcat7.1  demo.example.com
tc0001 tomcat7.2  quest.example.com
tc0001 tomcat7.5  www.example.com
Run Code Online (Sandbox Code Playgroud)

这里:

  • -F="/|="将输入字段分隔符设置为/=.然后,它将输出字段分隔符设置为选项卡.

  • {print $3, $5, $NF} 根据输入字段分隔符打印第3,第5和最后一个字段.


看另一个例子:

$ cat file
hello#how_are_you
i#am_very#well_thank#you
Run Code Online (Sandbox Code Playgroud)

这个文件有两个字段分隔符,#_.如果我们想打印第二个字段而不管分隔符是一个还是另一个,让我们两个都是分隔符!

$ awk -F"#|_" '{print $2}' file
how
am
Run Code Online (Sandbox Code Playgroud)

文件编号如下:

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6
Run Code Online (Sandbox Code Playgroud)


Tho*_*hor 5

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

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'
Run Code Online (Sandbox Code Playgroud)


小智 5

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

awk -F'[2-5a# ]{2,6}' ...
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

文件内容:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)
Run Code Online (Sandbox Code Playgroud)

命令:

awk -F"[()]" '{print $2}' filename
Run Code Online (Sandbox Code Playgroud)

结果:

smbw
smbt
smbn
smbs
Run Code Online (Sandbox Code Playgroud)

使用 awk 只打印之间的文本[]

使用awk -F'[][]'awk -F'[[]]'不会工作。

http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html

  • 您的答案出现在删除队列中,因为十分之九的信誉度为 1 的用户链接到自己的博客通常是垃圾邮件。但你的情况是个例外。过去 10 年的内容是一座金矿,希望您有计划让它永垂不朽。 (3认同)