Поиск определенных строк с помощью grep (или аналогичного)

У меня есть две части знакомой мне строки, называемые phrase1 и phrase2, которые находятся в одной строке файла и встречаются несколько раз по всему файлу. Мне нужно извлечь эти строки из файла; однако между ними есть цифры, которых я не знаю, и строки могут отличаться. Например, есть строки, которые могут выглядеть следующим образом:

phrase1 654654 phrase2
phrase1 22 phrase2
phrase1 949 phrase2

etc. 

Однако я знаю, что могу написать код специально для конкретной строки. Например, я могу написать для строки 2 выше следующее, чтобы найти его:

grep "phrase1 [0-9][0-9] phrase2" file

Какой код я могу написать, используя grep (или аналогичный), чтобы извлечь все строки, содержащие как phrase1, так и phrase2 не зная чисел или что-нибудь еще в этом отношении, между?

1
задан 21 November 2013 в 15:00

3 ответа

Если строки, которые вы ищете , начинаются с phrase1, а заканчиваются с phrase2, то я бы предложил

grep "^phrase1.*phrase2$"

. список используемых специальных символов

  • ^ соответствует началу строки
  • $ соответствует концу строки
  • . соответствует каждому символ
  • * соответствует 0 или более экземплярам предыдущего символа

Таким образом, в основном grep ищет строки, начинающиеся с phrase1, за которыми следуют 0 или более символов и заканчивая phrase2.

0
ответ дан 21 November 2013 в 15:00
  • 1
    Подкачка, вероятно, является проблемой, но удаление будет проблемы правого дела, когда компьютер исчерпает память (удивительно легкий с 4 ГБ). Изменение swapiness (также детализировал здесь ) должно быть достаточно, Вы не должны должны быть отключать его. – Wilf 19 May 2015 в 18:21

Два метода: с регулярными выражениями:

grep "phrase1 .* phrase2" file

Этот поиск для фразы1, одного пробела, строки символов, которые могут быть любыми, другого пробела и фразы2, в любом месте строки ( это соответствует строкам, которые содержат больше материала до «фразы1» и после «фразы2»)

Если две фразы должны находиться в начале и конце строки, см. ответ @AndreasT: вы можете использовать ^ и $ «закрепить» регулярное выражение в начале и конце строки.

Если вы хотите сопоставить только цифры между двумя фразами, ответ minerz029 будет правильным; «[0-9] +» соответствует повторению цифры («+» означает «последовательность, по крайней мере, одного символа»).

Если вы хотите, чтобы числа и фраза1 и фраза2 были в начале и конце фразы, объедините двойки:

grep "^phrase1 [0-9]+ phrase2$" file

Или «трюк» /hack...

grep "phrase1" file | grep "phrase2"

Explication: первая команда ищет все вхождения фразы1, затем «передает» результирующие строки в качестве входных данных во второй grep, который выводит все строки, соответствующие фразе2.

Однако, как заметил @AndreasT, этот второй метод соответствует обращенному шаблону «фраза2 ... фраза1», что может быть нежелательным.

0
ответ дан 21 November 2013 в 15:00
  • 1
    Спасибо за Ваш ответ. Я сделал все инструкции.. I' ll тестируют систему в течение некоторого времени и сообщают Вам. – Sam 19 May 2015 в 16:14

Используйте это для обнаружения только цифр между фразами:

grep -E '^phrase1 [0-9]+ phrase2 

Опция -E использует «Расширенные регулярные выражения», добавляя поддержку оператора +.

Разбивка:

  • ^ означает совпадение с началом строки.
  • + после [0-9] означает поиск одного или нескольких вхождений предыдущего выражения, которое в данном случае является классом [0-9].
  • $ означает совпадение с концом строки.

Опция -E использует «Расширенные регулярные выражения», добавляя поддержку оператора +.

Разбивка:

  • ^ означает совпадение с началом строки.
  • + после [0-9] означает поиск одного или нескольких вхождений предыдущего выражения, которое в данном случае является классом [0-9].
  • $ означает совпадение с концом строки.
0
ответ дан 21 November 2013 в 15:00
  • 1
    Я думаю, что это работало! Система немного быстрее теперь.. и никакая задержка ' до момента. – Sam 19 May 2015 в 19:19

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

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