Как я могу искать две различных фразы, когда они находятся на двух различных строках при помощи сингла grep
команда?
Например,
Строка 1: Это - конфета.
Строка 2: лимон.
Я использовал это, но никакой результат
grep "sweet.*lemon" file_type
Использовать 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
только распечатайте подобранную частьВот довольно надежный метод дразнения двух линий, которые появляются рядом. Я изложил его так, чтобы порядок линий не имел значения, но если это имеет значение, это можно легко скорректировать.
Сначала я создал файл со строками:
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 строки) или если целевая строка находится где-то еще в файле. (Очевидно, что файл с одной строкой может возвращать только одну строку.)
Затем мы получаем эти результаты, используя тот же метод со вторым поисковым запросом. Это сократит три строки сверху до двух строк, если только оба термина не появятся на одной линии.