Grep n'th element - PullRequest
       8

Grep n'th element

0 голосов
/ 13 июня 2018

У меня есть файл журнала, в который мне нужно добавить некоторые конкретные поля.

Файл журнала использует пробелы для разделения элементов в строках, но строка также может содержать предложение с кавычками.Мне нужно выполнить 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 голосов
/ 13 июня 2018

Печатает четвертое и третье поля с конца.

awk '{print $(NF-3),$(NF-2)}' file
"barbar foo"
"barbar foo"
0 голосов
/ 13 июня 2018

Использование 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]'
0 голосов
/ 13 июня 2018

С GNU grep

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

или более с sed

sed -En 's/^([^" ]+ |"[^"]*" ){12}([^" ]+|"[^"]*").*$/\2/p' file 
0 голосов
/ 13 июня 2018

Использование GNU awk:

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

Подробнее о FPAT здесь .

...