Grep 第 n 个元素
Grep n'th element
我有一个日志文件,我需要在其中对某些特定字段进行 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 个元素,第一行是 "barbar foo",第二行是 "abc foo"
所以
cut -d " " -f 13
不会这样做,因为第一行第 11 个元素有 "bar foo",第二行第 11 个元素是 "barfoo"
希望这是有道理的!
感谢所有帮助
使用 GNU awk:
$ awk 'BEGIN{FPAT="([^ ]*)|(\"[^\"]+\")"}{print }' file
"barbar foo"
"barbar foo"
更多关于 FPAT here。
使用 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]'
使用 GNU grep
grep -Po '^([^" ]+ |"[^"]*" ){12}\K([^" ]+|"[^"]*")' file
或更便携 sed
sed -En 's/^([^" ]+ |"[^"]*" ){12}([^" ]+|"[^"]*").*$//p' file
从末尾打印第四个和第三个字段。
awk '{print $(NF-3),$(NF-2)}' file
"barbar foo"
"barbar foo"
我有一个日志文件,我需要在其中对某些特定字段进行 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 个元素,第一行是 "barbar foo",第二行是 "abc foo"
所以
cut -d " " -f 13
不会这样做,因为第一行第 11 个元素有 "bar foo",第二行第 11 个元素是 "barfoo"
希望这是有道理的! 感谢所有帮助
使用 GNU awk:
$ awk 'BEGIN{FPAT="([^ ]*)|(\"[^\"]+\")"}{print }' file
"barbar foo"
"barbar foo"
更多关于 FPAT here。
使用 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]'
使用 GNU grep
grep -Po '^([^" ]+ |"[^"]*" ){12}\K([^" ]+|"[^"]*")' file
或更便携 sed
sed -En 's/^([^" ]+ |"[^"]*" ){12}([^" ]+|"[^"]*").*$//p' file
从末尾打印第四个和第三个字段。
awk '{print $(NF-3),$(NF-2)}' file
"barbar foo"
"barbar foo"