2017-04-25 39 views
2

我试图解析,将有这样的线日志文件:猛砸包括字符之间的字符串中的awk打印

aaa bbb ccc: [DDD] efg oi  
aaa bbb ccc: lll [DDD] efg oo  
aaa bbb ccc: [DDD] 

其中[DDD]可在线路的任何地方。

只有一件事会[]之间的任何行

用awk和空间作为分隔符,我怎么可以打印1,第3和[]之间的所有数据(整个字符串)?

预期输出:aaa ccc: DDD

+2

你尝试过什么,怎么做的失败?看起来你应该能够通过阅读任何Awk介绍的第一页的一半来解决这个问题。 – tripleee

+0

'awk'{print $ 1,$ 3,$ 4}'文件' – RomanPerekhrest

+0

'awk'{print $ 1,$ 3,???}'',可以在某些位置打印数据,但我在寻求帮助可以在任何字符串中的字符。 –

回答

3

GAWK(GNU AWK)的方法:

比方说,我们有以下行文件:

aaa bbb ccc: ddd [fff] ggg hhh 

的命令:

awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file 

输出:

aaa ccc: fff 

匹配(字符串,正则表达式[,数组])最长,最左边的
搜索 SUBSTRING由正则表达式匹配regexp并返回该子串开始的字符位置(索引)(一个,如果它开始于轧制字符串)。如果没有找到匹配,返回零..

+0

将位于“[”和“]”之间的数据不必位于第4个位置 –

+1

$ 1并且3美元是强制性的?如果'['和']'之间的数据在任意位置,是否可以有多个条目,比如'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'? – RomanPerekhrest

+0

'[''''''$和$ 3之间只有一个条目是强制性的 –

1

考虑:

$ cat file 
aaa bbb ccc: [DDD] efg oi  
aaa bbb [ccc:] lll DDD efg oo  
aaa [bbb] ccc: DDD 

(注意 - 从OP的例子改变)

在POSIX awk

awk 'BEGIN{fields[1]; fields[3]} 
           {s="" 
           for (i=1;i<=NF;i++) 
             if ($i~/^\[/ || i in fields) 
              s=i>1 ? s OFS $i : $i 
           gsub(/\[|\]/,"",s) 
           print s 
           }' file 

打印:

aaa ccc: DDD 
aaa ccc: 
aaa bbb ccc: 

如果同时包含在[]和选定的fields数组中,则不会打印该字段两次。 (即,[aaa] bbb ccc:不打印aaa两次)也将打印在正确的字段顺序,如果你有aaa [bbb] ccc ...

-1
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file 

awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file 

aaa ccc: DDD 
+0

我想知道什么是错的? –

+0

不确定,但代码只回答一般皱眉。 –