У меня есть текст, содержащий несколько строк. Итак, мне нужно сделать 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 для путь более детально.