在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
自动拆分模式–perl将自动将输入行拆分为-a
数组。默认为按空格拆分@F
自动拆分修饰符,在本例中,在-F
或/
=
执行perl代码-e
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年的内容是一座金矿,希望你有一个让它永垂不朽的计划。