Назад | Перейти на главную страницу

Grep по блоку текста \ строк

У меня есть текст, содержащий несколько строк. Итак, мне нужно сделать GREP из нескольких строк. Например, у меня есть повторяющийся текст, и я должен GREP получить строки, в которых есть повторяющиеся ключевые слова.

grep -o "test|test2" textfile

Мой текст:

123|never for your|test
123421|never for your|test2
123412|never for your|test3
12341|never for your|test4
12311|never for your|test2
123312312|never for your|test
123321312|never for your|test2

Мне следует иметь:

123|never for your|test
123421|never for your|test2
123312312|never for your|test
123321312|never for your|test2

Это работает, но не работает так, как я хочу. Он ищет в тексте все слова «test» и «test2». Но я хочу получить текстовые блоки, как какой-то шаблон, где только после «test» идет «test2». Есть идеи?

Краткий сценарий оболочки с использованием sed. Создает список номеров строк для второго случая и сравнивает их с номерами строк для первого случая. Печатает совпадающие пары. В качестве имени файла используется первый аргумент. Может быть легко расширен, чтобы принимать второй и третий аргументы в качестве шаблонов для сопоставления. Можно сохранить как findnext.sh и запустить:

$ sh findnext.sh testfile

Должен быть быстрым, так как он включает только два прохода по файлу и имеет преимущество полной переносимости.

#!/bin/sh 
# Line numbers matching test1
mt2=$(sed -ne '/test1/=' < $1 | tr '\n' '/')

for l in $(sed -ne '/test/=' < $1); do
    nextline=$(expr $l + 1)
    [ "${mt2#*$nextline/}" != "$mt2" ] && sed -ne $l,${nextline}p <$1
done

Вы можете попробовать grep -E или egrep. Пожалуйста, попробуйте вот так

#this will show lines that have test or test2
    grep -E "test|test2" file

Если вы хотите показать строку, в которой есть test и test2, как этот test | test2, сделайте это

# This will show lines that has test|test2
    grep "test\|test2" file
grep -A 1 "test$" in.txt | grep -B 1 "test2$"

В руководстве по grep

-A NUM Выведите ЧИСЛО строк конечного контекста после совпадающих строк.

-B NUM Выведите NUM строк ведущего контекста перед совпадающими строками.

Команда grep -Pzo ".*test$\n.*test2$" in.txt тоже работает, но в руководстве написано: «Это экспериментально, и grep -P может предупреждать о нереализованных функциях».

awk может быть вашим инструментом для этого:

awk '/test$/, /test2$/' < block-text-lines.txt 

общая форма:

awk '/start-pattern/, /end-pattern/{command}'

Но поскольку по умолчанию командный блок работает с печатью, только начальный и конечный паттерны делают свое дело.

Проверять, выписываться man awk или Руководство пользователя Gnu Awk для путь более детально.