3

У меня есть файл с несколькими очень длинными строками. Я хочу grep для строки, которая может встречаться в файле несколько раз, в том числе, возможно, более одного раза в одной строке.

$ cat 2014-11-03.json | grep 218

Это производит нечитаемый вывод. Там слишком много всего.

$ cat 2014-11-03.json | grep -o 218

Это сокращает слишком много. Он показывает только соответствующий шаблон без какого-либо контекста.

В основном, я хочу вывод, как

... <category_id>218</category_id> ...

(Да, это XML, но я не хочу анализировать XML. Я просто хочу вывести соответствующую строку с несколькими символами по обе стороны от нее. Всего несколько символов, а не вся строка.)

Grep, кажется, имеет опции для отображения только совпавшей строки, или совпавшей строки в контексте полной строки (поведение по умолчанию), или совпавшей строки в контексте нескольких строк до и после, но я не могу найти опцию чтобы показать совпавшую строку в контексте нескольких символов до и после.

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

Это не идеально: он работает до тех пор, пока в рассматриваемом файле есть пробелы примерно в нужных местах. Это сработало для меня на этот раз, но нет никаких гарантий, что это будет снова.

2 ответа2

7

Этот вопрос старый, но, поскольку я наткнулся на него, когда искал способ получить grep только часть строки, вот так:

Обходной путь - включить параметр «только сопоставление», а затем использовать возможности RegExp, чтобы получить немного больше, чем ваш текст:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

Конечно, если вы используете цветовую подсветку, вы всегда можете использовать grep, чтобы закрасить только реальное соответствие:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

Замечания:

  • это может не вернуть все ожидаемые результаты, если у вас есть несколько совпадений в строке:. {0,50} может совпадать с частью следующего совпадения и, таким образом, мешать сопоставлению.
  • Это регулярное выражение медленное. Очень медленно. (см. комментарии для возможного решения)
0

Лучший способ показать json в хорошем формате - использовать pjson. После форматирования вы можете добавить команду grep.

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

Установите его с помощью pip:

pip install pjson

а затем передайте любое содержимое json в pjson .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .