在awk中使用多个分隔符

在awk中使用多个分隔符,awk,command-line,text-processing,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.pro

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

/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

如何提取域名位于
'='
之后的最后一个字段?如何使用多个分隔符来提取字段?

分隔符可以是正则表达式

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}'
好消息
awk
字段分隔符可以是正则表达式。您只需要使用
-F“| |…”

返回:

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}
    根据输入字段分隔符打印第三、第五和最后一个字段


请参见另一个示例:

awk -F'[2-5a# ]{2,6}' ...
$cat文件
你好,你好吗
我很好,谢谢你
此文件有两个字段分隔符,
#
。如果我们想打印第二个字段,不管分隔符是一个还是另一个,让我们将两者都设为分隔符

$ awk -F"#|_" '{print $2}' file
how
am
其中,文件编号如下:

你好#你好#我很好#很好#谢谢#
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
1    2   3   4            1  2   3    4    5    6

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


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

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

awk -F'[2-5a# ]{2,6}' ...
我确信使用()和参数Perl one-liner可以实现这种变化:

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file
使用以下命令行选项:

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

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

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

  • -F
    自动拆分修饰符,在本例中,在
    /
    =

  • -e
    执行perl代码


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

另一个选项是使用-F选项,但将其传递给regex以打印左括号和右括号之间的文本

文件内容:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)
awk -F"[()]" '{print $2}' filename
smbw
smbt
smbn
smbs
命令:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)
awk -F"[()]" '{print $2}' filename
smbw
smbt
smbn
smbs
结果:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)
awk -F"[()]" '{print $2}' filename
smbw
smbt
smbn
smbs
使用awk仅打印
[]
之间的文本:

使用
awk-F'[]]'
但是
awk-F'[]]'
将不起作用


当然,
cat
过程不是必需的:
awk'…'文件
。另外,使用输出字段分隔符会更整洁:
awk-F'[/=]'-v of s=“\t”{print$3,$5,$8}'
awk分隔符可以是正则表达式。。。这让我很开心@das.cyklone:awk也可以有几个分隔符,带有
:例如:
awk-F'this | that |[=/]'''.
(用于用单词/字符串分隔事物)(注意,这会使域中的空格保持在两个分隔符之间。还添加
[\t]+
可能有用,但会让事情变得棘手…因为在“this”之前和之后经常有空格,这会在空格和“this”之间额外出现两个空字段。)我在两个不同的发行版上尝试过这个方法,得到了相同的行为:我想从netstat-ntpl“netstat-ntpl”sed's/:/“| awk'{print$5}”获取端口工作,但可以做没有双重管道这项工作,但我并不期待字段17上的数据:“netstat-ntpl | awk-F”|:“{print$17}”是的。。。这让我得到了我想要的:awk-F“[:]+”/\/postmaster*$/{print$5}”
print$3”“$5”“$7
可以像
print$3、$5、$7
一样打印。另外,我不认为使用awk然后通过管道连接到sed有什么好处。一般来说,awk就足够了,其他人的回答表明了这一点。为了回答我的相同但不同的问题,
awk
在字段为空时吞没了字段,从而阻止了字段编号。我将
-F”“
更改为
-F”[]”
,并且
awk
不再接受空字段。感谢@BUFU的编辑。我删除了OFS引用,只关注FS部分,但拥有它也很好。干杯你的答案出现在删除队列中,因为10次中有9次,有1个信誉链接到自己博客的用户通常是垃圾邮件。但你的是例外。过去10年的内容是一座金矿,希望你有一个让它永垂不朽的计划。