У меня есть несколько сжатых файлов журнала, в которых есть текст между строками в формате:
someRandomText... ,"interestingKey":"interestingValue",moreRandomText
Для этого попробовал zgrep -o -i '"interestingKey":[^ ]*' logs*
Несмотря на то, что он находит соответствующую строку, он выводит текст до и после шаблона в строке.
Есть ли способ ограничить результаты только парой ключ-значение. И есть ли способ также отфильтровать интересное значение к тем, у которых есть только числа и нет алфавитов?
Примечание: ключ должен быть нечувствительным к регистру. Ключ всегда один и тот же. Стоимость всегда разная.
Журналы содержат много текста и json.
Использовать опережающий просмотр grep
, здесь
$ echo 'someRandomText... ,"interestingKey":"interestingValue",moreRandomText' | grep -oP '(?<=interestingKey":).*(?=,)'
"interestingValue"
Для файла
$ grep -oP '(?<=interestingKey":).*(?=,)' inputFile
Вы можете использовать zgrep
вместо grep
для файлов, сжатых с помощью gzip. Те же варианты должны работать.
Это почти то, что меня интересует. Но он также выдает вещи после ценности. Вы можете предположить, что значение всегда заканчивается цитатой. Прямо сейчас он печатается до конца строки
Он печатает все, что находится между interestingKey":
и следующей запятой (,
). Он не должен печататься до конца строки. Обратите внимание, что входной шаблон lookahead
должен быть исправлен.
Ты хочешь:
zgrep -oiP '"interestingKey":"\K[^"]*'
Что будет
найдите имя ключа в кавычках, затем двоеточие и начальную кавычку значения.
Тогда директива \K
"забывает" о найденном до сих пор тексте.
Затем мы сопоставляем некоторые символы без кавычек, которые выдаст -o
.
другой,
$ ... | grep -oP '(?<=interestingKey":)[^,]+'
вы даже можете удалить кавычки, если сделаете это частью матча.
Можно сделать и с awk
, но это не лучшее решение.
awk -F, '{for(i=1;i<=NF;i++)if ($i~/interestingKey/)print $(i+1)}' file
moreRandomText
Поскольку он проходит через все элементы, он немного медленный.
Этот «случайный текст» имеет вид JSON. Это?