У меня есть ряд строк, извлеченных из файла после выполнения команды grep следующим образом:
var=`grep xyz abc.txt`
Допустим, в результате я получил 10 строк, состоящих из xyz.
Теперь мне нужно обработать каждую строку, полученную в результате выполнения команды grep. Как мне поступить для этого?
grep -o
для такого рода вещей.-o
Флаг будет возвращать только текст , который соответствует, с одной спички на линии выхода. (Он не является исчерпывающим, поэтомуecho aaa |grep 'a*'
дает только «ааа» и пропускает три частичных совпадения »,« а »и« аа »)Ответы:
Один из простых способов - не сохранять выходные данные в переменной, а непосредственно перебирать их с помощью цикла while / read.
Что-то вроде:
Существуют варианты этой схемы в зависимости от того, что именно вы ищете.
Если вам нужно изменить переменные внутри цикла (и сделать это изменение видимым вне его), вы можете использовать подстановку процесса, как указано в ответе fedorqui :
источник
while read p || [[ -n $p ]]; do ...
(заимствовано из stackoverflow.com/questions/1521462/… )Вы можете сделать следующее
while read
цикл, который будет подпитываться результатомgrep
команды, используя так называемую подстановку процесса:Таким образом, вам не нужно сохранять результат в переменной, а непосредственно «вводить» его вывод в цикл.
Обратите внимание на использование
IFS=
и вread -r
соответствии с рекомендациями BashFAQ / 001: Как я могу читать файл (поток данных, переменную) построчно (и / или поле за полем)? :Что касается подстановки процесса, это объясняется на странице bash hackers :
источник
for
версию. Попытался сделать цикл,"${$(grep xyz abc.txt)[@]}"
как в stackoverflow.com/a/14588210/1983854, но не смог. Поэтому я просто оставляю первую версию.zsh
, где, вероятно, работает такой тип вложенности).while IFS= read -r result <&3
иdone 3< <(grep ...
Я бы предложил использовать awk вместо grep + что-то еще здесь.
awk '$0~/xyz/{ //your code goes here}' abc.txt
источник
//your code goes here
?Без какой-либо итерации с опцией --line-buffered grep:
Пример из реальной жизни с выходными данными команды отладки маршрутизатора Symfony PHP Framework для grep всех связанных с «api» маршрутов:
источник
tail -f some.log
, в моем случае) ...Часто порядок обработки не имеет значения. GNU Parallel сделан для этой ситуации:
Если вы обрабатываете больше похоже на:
и
myprogram
медленно, тогда вы можете запустить:источник
Переберите результаты grep с помощью цикла while / read. Подобно:
источник
Для тех, кто ищет однострочник:
источник