我试图解析,将有这样的线日志文件:猛砸包括字符之间的字符串中的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
我试图解析,将有这样的线日志文件:猛砸包括字符之间的字符串中的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
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并返回该子串开始的字符位置(索引)(一个,如果它开始于轧制字符串)。如果没有找到匹配,返回零..
将位于“[”和“]”之间的数据不必位于第4个位置 –
$ 1并且3美元是强制性的?如果'['和']'之间的数据在任意位置,是否可以有多个条目,比如'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'? – RomanPerekhrest
'[''''''$和$ 3之间只有一个条目是强制性的 –
考虑:
$ 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 ...
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file
或
awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file
aaa ccc: DDD
我想知道什么是错的? –
不确定,但代码只回答一般皱眉。 –
你尝试过什么,怎么做的失败?看起来你应该能够通过阅读任何Awk介绍的第一页的一半来解决这个问题。 – tripleee
'awk'{print $ 1,$ 3,$ 4}'文件' – RomanPerekhrest
'awk'{print $ 1,$ 3,???}'',可以在某些位置打印数据,但我在寻求帮助可以在任何字符串中的字符。 –