Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 格雷普n';th元素_Regex_Linux_Bash_Grep_Cut - Fatal编程技术网

Regex 格雷普n';th元素

Regex 格雷普n';th元素,regex,linux,bash,grep,cut,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一些特定字段

日志文件使用空格分隔行中的元素,但行也可能包含带引号的句子。我需要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个元素,第一行是“BarbarFoo”,第二行是“abc foo”

那么

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

希望这有意义! 感谢使用GNU awk提供的所有帮助

$ awk 'BEGIN{FPAT="([^ ]*)|(\"[^\"]+\")"}{print $13}' file
"barbar foo"
"barbar foo"
有关使用GNU awk的详细信息:

$ awk 'BEGIN{FPAT="([^ ]*)|(\"[^\"]+\")"}{print $13}' file
"barbar foo"
"barbar foo"
有关使用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]'
使用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}([^" ]+|"[^"]*").*$/\2/p' file 

使用GNU
grep

grep -Po '^([^" ]+ |"[^"]*" ){12}\K([^" ]+|"[^"]*")' file 
或使用
sed更便于携带

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

从末尾打印第四个和第三个字段

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

从末尾打印第四个和第三个字段

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

第二行是“abc foo”不,不是。没错,第二行也是“barbarfoo:)堆栈溢出不是一种代码编写服务。请显示您的代码。第二行是“abc foo”不,不是。没错,第二行也是“barbarfoo:)堆栈溢出不是一种代码编写服务。请展示您的代码。通常perl与awk相比在我看来是希腊语,但在这种特殊情况下,它们看起来同样古怪D++@JamesBrown嗯,所有粗糙的位都在正则表达式中。:-)@WiktorStribiżew很好的观点。那是个大脑放屁;我的意思是
[^\s”]
。这也很管用!非常感谢!无论我多么喜欢AWKUSALly perl而不是awk,在我看来都是希腊语,但在这个特殊的情况下,它们看起来同样令人恶心。:D++@JamesBrown嗯,所有粗糙的部分都在正则表达式中。:-@WiktorStribiż这是一个很好的观点。这是一个大脑放屁;我的意思是
[^\s”]
。好吧,这也行!谢谢!我到底有多喜欢awk