Подтвердить что ты не робот

Grep для содержимого AFTER pattern

С учетом файла, например:

potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789

Я хотел бы grep для всех строк, начинающихся с potato:, а только для строк, следующих за Potato. Таким образом, в приведенном выше примере выход будет выглядеть следующим образом:

1234
5432

Как я могу это сделать?

4b9b3361

Ответ 1

grep 'potato:' file.txt | sed 's/^.*: //'

или

grep 'potato:' file.txt | cut -d\   -f2

или

grep 'potato:' file.txt | awk '{print $2}'

или

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

или

awk '{if(/potato:/) print $2}' < file.txt

или

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

Ответ 2

Или используйте утверждения регулярных выражений: grep -oP '(?<=potato: ).*' file.txt

Ответ 3

sed -n 's/^potato:[[:space:]]*//p' file.txt

Можно подумать о Грепе как о ограниченном Седе, или о Седе как обобщенном Грепе. В этом случае Sed - это один хороший, легкий инструмент, который делает то, что вы хотите - хотя, конечно, существует несколько других разумных способов сделать это тоже.

Ответ 4

Это будет печатать все после каждого совпадения только в той же строке:

perl -lne 'print $1 if /^potato:\s*(.*)/' file.txt

Это сделает то же самое, за исключением того, что он также напечатает все последующие строки:

perl -lne 'if ($found){print} elsif (/^potato:\s*(.*)/){print $1; $found++}' file.txt

Используются следующие параметры командной строки:

  • -n цикл вокруг каждой строки входного файла
  • -l удаляет новые строки перед обработкой и добавляет их обратно
  • -e выполнить код perl