Невозможно извлечь точные пары ключ-значение из файлов журнала - PullRequest
0 голосов
/ 07 сентября 2018

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

someRandomText... ,"interestingKey":"interestingValue",moreRandomText

Для этого я пытался zgrep -o -i '"interestingKey":[^ ]*' logs* Несмотря на то, что он находит соответствующую строку, он выводит текст до и после выделенного шаблона в строке.

Есть ли способ ограничить результаты только парой ключ-значение. И есть ли способ также отфильтровать интересное значение для тех, которые имеют только цифры и не имеют алфавитов?

Примечание: ключ должен быть без учета регистра. Ключ всегда один и тот же. Значение всегда отличается.

Ответы [ 4 ]

0 голосов
/ 08 сентября 2018

Можно сделать с awk, но это не лучшее решение.

awk -F, '{for(i=1;i<=NF;i++)if($i~/interestingKey/)print $(i+1)}' file
moreRandomText

Поскольку он проходит по всем элементам, он немного медленный.

0 голосов
/ 07 сентября 2018

Вы хотите:

zgrep -oiP '"interestingKey":"\K[^"]*' 

Это будет найдите имя ключа в кавычках, за которым следует двоеточие и начальная кавычка значения.
Тогда директива \K "забывает" о сопоставленном тексте.
Затем мы сопоставляем некоторые символы без кавычек, которые будет выдавать -o.

0 голосов
/ 07 сентября 2018

еще один,

$ ... | grep -oP '(?<=interestingKey":)[^,]+'

Вы можете даже удалить кавычки, если сделаете это частью матча.

0 голосов
/ 07 сентября 2018

Используйте grep Lookahead, здесь

$ echo 'someRandomText... ,"interestingKey":"interestingValue",moreRandomText' | grep -oP '(?<=interestingKey":).*(?=,)'
"interestingValue"

Для файла

$ grep -oP '(?<=interestingKey":).*(?=,)' inputFile

Вы можете использовать zgrep вместо grep для сжатых файлов. Те же параметры должны работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...