LINUX.ORG.RU

grep подряд 2 строки со своими паттернами

 


0

2

Приветствую всех!

Нужно извлечь 2 строки текста
Условие:
Эти строки в тексте обязательно следуют друг за другом и содержат:
первая «pattern1», вторая «pattern2»

line with pattern1
line with pattern2
Some text goes here.
new line with pattern1
Some more text
new line with pattern2

Должно быть так:

line with pattern1
line with pattern2


Напиши скрипт на баше.

Сначала грепаешь (pattern1 или pattern2), потом пробегаешь в цикле по получившимся строкам и, если встречается комбинация, которую ты указал, то получившиеся строки печатаются.

yura_ts ★★
()
Ответ на: комментарий от serles

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

yura_ts ★★
()

Как-то так:

awk '/pattern1/ {p1=$0; second=NR+1} (NR==second)&&/pattern2/ {print p1; print $0}'
(я не настоящий авкер, наверняка можно улучшить).

LeninGad
()
Ответ на: комментарий от serles
~ $ cat tst1
#!/bin/sh

  sed -n '/pattern1/ { N ; /\n.*pattern2/ p ; }' <<EOF

line with pattern1
line with pattern2
Some text goes here.
new line with pattern1
Some more text
new line with pattern2
VotTakTak
Another pattern1
Another pattern2
TakToVot

EOF

exit

~ $ ./tst1
line with pattern1
line with pattern2
Another pattern1
Another pattern2
~ $
ABW ★★★★★
()
Ответ на: комментарий от LeninGad

через getline можно следующую строку прочитать,

cat file | awk '/pattern1/ { line1=$0; getline;  if ( match($0,"pattern2")  ) {line2=$0; print line1; print line2; }  }'

bl ★★★
()
Ответ на: комментарий от serles

Всем Огромнейшее спасибо! Задача решена!

serles
() автор топика
Ответ на: комментарий от bl

Ломается (как и пример с sed и N в соседнем комменте) при таком входе:

pattern1
pattern1
pattern2

Впрочем, мой вариант, кажется, ломается в случае, когда встречаются строки, соответствующие и pattern1, и pattern2 (не вникал).

LeninGad
()
Последнее исправление: LeninGad (всего исправлений: 1)

Если grep GNU'тый, то можно так:

grep -A1 $firstline $file | grep -B1 $secondline
router ★★★★★
()
Ответ на: комментарий от LeninGad
#!/bin/sh

  T='
     1 f
     2 p1
     3 p1
     4 p2
     5 f
     6 p1
     7 f
     8 p2
     9 f
     10 p1
     11 p2
     12 f
     13 p1
     14 p1 p2
     15 p2
     16 f
    '
  echo "${T}" | sed -n '/p1/ { N ; /\n.*p2/ p ; D ; }'
  echo
  echo "${T}" | sed -n '/p1/ { N ; /\n.*p2/ { p ; d ; } ; D ; }'

exit


Разница в реакции на строки 13-15.

ABW ★★★★★
()
Ответ на: комментарий от reprimand

не проверял, linux под рукой нет

Тестировал ли ты то, что написал? :) Я да.

читал ли ты то, что я написал? :) Я вижу, что нет

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

Не спорьте, то, что Вы написали - не работает!
При наличии обоих паттернов в одной строке - выводит её. что не есть гуд.

serles
() автор топика
grep  'pattern1\|pattern2' file
perl -nle 'print if /pattern1/ || /pattern2/' file
awk '/pattern1/ || /pattern2/ { print }' file
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.