Grep для содержимого AFTER pattern
С учетом файла, например:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
Я хотел бы grep для всех строк, начинающихся с potato:
, а только для строк, следующих за Potato
. Таким образом, в приведенном выше примере выход будет выглядеть следующим образом:
1234
5432
Как я могу это сделать?
Ответы
Ответ 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