Как использовать grep для 2 различных строк

Как я могу искать две различных фразы, когда они находятся на двух различных строках при помощи сингла grep команда?

Например,

Строка 1: Это - конфета.

Строка 2: лимон.

Я использовал это, но никакой результат

grep "sweet.*lemon" file_type
15
задан 10 December 2016 в 02:23

3 ответа

Как это:

grep "sweet\|lemon"
6
ответ дан 23 November 2019 в 02:43

Использовать grep для двух различных строк ищите оба шаблона

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Или используйте чередование

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Для получения следующей строки после шаблона Вы могли использовать опцию контекста

$ grep -A1 sweet file_type
This is a sweet
lemon.

Но если Вы ищете явно многострочный шаблон, это хитро потому что grep думает в строках.... Ваш .* поймает все между "сладким" и "лимоном" на строке. Мы можем получить "лимон" на следующей строке с -P использование \n соответствовать новой строке и путем сообщения grep файл пустой разделенный с -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Примечания:

  • -E Используйте расширенные регулярные выражения (для использования | символ для чередования, не будучи должен выйти из него)
  • -An Распечатайте дополнительные строки после шаблона, где n является количеством запаздывающих строк для печати
  • -P Используйте регулярные выражения perl-стиля ("экспериментальный" в grep - установка pcregrep вместо этого для лучшего жемчуга regex поддержка)
  • -z Используйте нулевой символ в качестве разделителя (просто притворяющийся в этом случае, но grep будет верить на слово),
  • -o только распечатайте подобранную часть
20
ответ дан 23 November 2019 в 02:43

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

Сначала я создал файл со строками:

dog 
fish 
elephant 
wombat 
cat 
pickle 
anglepoise lamp 

Затем я выполнил следующие тесты, чтобы продемонстрировать использование grep, включая -A и -B, чтобы выделить только две линии, о которых идет речь.

2020-08-14 02:08:45 →  touch Desktop/test/file.txt

2020-08-14 10:01:03 →  grep -A1 -B1 cat Desktop/test/file.txt 
wombat 
cat 
pickle 

2020-08-14 10:01:10 →  grep -A1 -B1 cat Desktop/test/file.txt | grep -A1 -B1 wombat 
wombat 
cat 

2020-08-14 10:01:27 →  grep -A1 -B1 cat Desktop/test/file.txt | grep -A1 -B1 pickle 
cat 
pickle 

2020-08-14 10:01:49 → 

Что происходит? Первые А и В означают после и до. Таким образом, мы готовимся к нашему термину (cat) и включаем в ответ одну строку после и одну строку перед нашей целевой линией. Это даст две или три строки в зависимости от того, является ли целевая строка первой или последней строкой (2 строки) или если целевая строка находится где-то еще в файле. (Очевидно, что файл с одной строкой может возвращать только одну строку.)

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

1
ответ дан 14 August 2020 в 17:08

Другие вопросы по тегам:

Похожие вопросы: