Grep n'th元素

时间:2018-06-13 11:59:03

标签: regex linux bash grep cut

我有一个日志文件,我需要grep一些特定的字段。

日志文件使用空格分隔行中的元素,但一行也可能包含带引号的句子。我需要grep第n个元素。

文件中的一行可能如下所示:

2018-05-01 12:05:16 9 10.10.10.20 ab bc - - foobar - "bar foo" - "barbar foo" cd ed
2018-05-01 12:05:16 9 10.10.20.20 ab bc - - foobar - "barfoo" abc "barbar foo" cd ed

我想grep第13个元素,第1行是“barbar foo”,第2行是“abc foo”

所以

cut -d " " -f 13 

不会这样做,因为第1行第11个元素有“bar foo”而第2行第11个元素是“barfoo”

希望这是有道理的! 感谢所有帮助

4 个答案:

答案 0 :(得分:3)

使用GNU awk:

$ awk 'BEGIN{FPAT="([^ ]*)|(\"[^\"]+\")"}{print $13}' file
"barbar foo"
"barbar foo"

更多关于FPAT here

答案 1 :(得分:2)

使用Perl:

$ perl -nE 'my @p = /"[^"]*"|[^\s"]\S*/g; say $p[12]' file
"barbar foo"
"barbar foo"

如果引用的部分可以包含转义引号(\"),那么您需要

$ perl -nE 'my @p = /"(?:[^"\\]|\\.)*"|[^\s"]\S*/g; say $p[12]'

答案 2 :(得分:1)

使用GNU grep

grep -Po '^([^" ]+ |"[^"]*" ){12}\K([^" ]+|"[^"]*")' file 

或以sed

进行移植
sed -En 's/^([^" ]+ |"[^"]*" ){12}([^" ]+|"[^"]*").*$/\2/p' file 

答案 3 :(得分:0)

从最后打印第四和第三个字段。

awk '{print $(NF-3),$(NF-2)}' file
"barbar foo"
"barbar foo"