grep 'potato:' file.txt | sed 's/^.*: //'
grep
ищет любую строку, содержащую строку potato:
, затем для каждой из этих строк sed
заменяет ( s///
- заменяет) любой символ ( .*
) от начала строки ( ^
) до последнего вхождения последовательности :
(двоеточие, за которым следует пробел) пустым строка ( s/...//
- замените первую часть второй частью, которая пуста).
или же
grep 'potato:' file.txt | cut -d\ -f2
Для каждой строки , которая содержит potato:
, cut
разделит линию на несколько полей , разделенных пробелами ( -d\
- d
= разделитель \
= спасся пробел, что - то вроде -d" "
бы и работал) и напечатать второе поле каждой такой линии ( -f2
).
или же
grep 'potato:' file.txt | awk '{print $2}'
Для каждой строки , которая содержит potato:
, awk
будет печатать второе поле ( print $2
) , который ограничен по умолчанию пробелов.
или же
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
Все содержащиеся строки potato:
отправляются в сценарий inline ( -e
) Perl, который берет все строки из stdin
, затем для каждой из этих строк выполняет ту же замену, что и в первом примере выше, а затем печатает ее.
или же
awk '{if(/potato:/) print $2}' < file.txt
Файл отправляется через stdin
( < file.txt
отправляет содержимое файла через stdin
команду слева) в awk
сценарий, который для каждой содержащейся строки potato:
( if(/potato:/)
возвращает истину, если регулярное выражение /potato:/
соответствует текущей строке) печатает второе поле, как описано выше.
или же
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
Файл отправляется через stdin
( < file.txt
см. Выше) в сценарий Perl, который работает аналогично приведенному выше, но на этот раз он также проверяет, что каждая строка содержит строку potato:
( /potato:/
это регулярное выражение, которое соответствует, если текущая строка содержит potato:
, и, если он выполняет ( &&
), затем применяет регулярное выражение, описанное выше, и печатает результат).
awk '$1 ~ /potato/ { print $2 }' file.txt
.awk '/potato:/ {print $2}'
perl -pe
Или используйте утверждения регулярного выражения:
grep -oP '(?<=potato: ).*' file.txt
источник
-o
означает печать только соответствующей части строки. Принимая во внимание ,-P
делает вывод Perl - совместимый с регулярным выражением, которое случается быть положительным просмотром назад регулярное выражение(?<=string)
.Можно думать о Grep как о ограниченном Sed или о Sed как о обобщенном Grep. В данном случае Sed - это хороший и легкий инструмент, который делает то, что вы хотите, хотя, конечно, есть и несколько других разумных способов сделать это.
источник
Это будет печатать все после каждого совпадения только в той же строке:
Это будет делать то же самое, за исключением того, что он также распечатает все последующие строки:
Используются следующие параметры командной строки:
-n
цикл вокруг каждой строки входного файла-l
удаляет символы новой строки перед обработкой и добавляет их после-e
выполнить код Perlисточник
-P
использовать регулярное выражение Perl-o
выводить только совпадение\s
чтобы соответствовать пробелу послеpotato:
\K
пропустить матч.*
чтобы соответствовать остальной части строки (строк)источник
Вы можете использовать grep, как указано в других ответах. Но вам не нужны grep, awk, sed, perl, cut или какие-либо внешние инструменты. Вы можете сделать это с помощью чистого bash.
Попробуйте это (точки с запятой используются, чтобы вы могли поместить все это в одну строку):
## указывает bash удалить самое длинное совпадение ":" в строке $ спереди.
или если вам нужен ключ, а не значение, %% указывает bash удалить самое длинное совпадение ":" в строке $ с конца.
Подстрока для разделения - ": \", потому что пробел должен быть экранирован обратной косой чертой.
Вы можете найти больше подобных в проекте документации по Linux .
источник
while read
очень медленно; использование внешней утилиты на самом деле будет намного быстрее, если вы выберете одну с буферизованным вводом-выводом (то есть практически любую из упомянутых в этом ответе и многих других).read -r
если только вы особо не требуете некоторого довольно неприятного устаревшего поведения до POSIX.Современный BASH поддерживает регулярные выражения:
while read -r line; do if [[ $line =~ ^potato:\ ([0-9]+) ]]; then echo "${BASH_REMATCH[1]}" fi done
источник