it-swarm.com.ru

Как обработать каждую строку, полученную в результате команды grep

У меня есть ряд строк, извлеченных из файла после выполнения команды grep следующим образом:

var=`grep xyz abc.txt`

Допустим, в результате я получил 10 строк, состоящих из xyz.

Теперь мне нужно обработать каждую строку, полученную в результате выполнения команды grep. Как мне поступить для этого?

119
P_Jain

Один из простых способов - не сохранять выходные данные в переменной, а непосредственно перебирать их с помощью цикла while/read.

Что-то вроде:

grep xyz abc.txt | while read -r line ; do
    echo "Processing $line"
    # your code goes here
done

Существуют варианты этой схемы в зависимости от того, что именно вы ищете.

Если вам нужно изменить переменные внутри цикла (и сделать это изменение видимым вне его), вы можете использовать подстановку процесса, как указано в ответ fedorqui :

while read -r line ; do
    echo "Processing $line"
    # your code goes here
done < <(grep xyz abc.txt)
218
Mat

Вы можете выполнить следующий цикл while read, который будет получен в результате выполнения команды grep с использованием так называемой подстановки процесса:

while IFS= read -r result
do
    #whatever with value $result
done < <(grep "xyz" abc.txt)

Таким образом, вам не нужно сохранять результат в переменной, а непосредственно «вводить» его вывод в цикл.


Обратите внимание на использование IFS= и read -r в соответствии с рекомендациями в BashFAQ/001: Как я могу читать файл (поток данных, переменную) построчно (и/или поле за полем)? :

Параметр -r для чтения предотвращает интерпретацию с обратной косой чертой (обычно используется В качестве пары новой строки с обратной косой чертой, для продолжения по нескольким строкам или для Экранирования разделителей). Без этой опции любые обратные косые черты без экранирования на входе будут отброшены. Вы должны почти всегда использовать -r вариант с чтением.

В приведенном выше сценарии IFS = предотвращает обрезку лидирующих и трейлинг-ов пробельные. Удалите его, если вы хотите этот эффект.

Что касается подстановки процесса, это объясняется на странице bash hackers :

Подстановка процесса - это форма перенаправления, где ввод или вывод процесса (некоторая последовательность команд) отображается как временный файл.

17
fedorqui

Я бы предложил использовать awk вместо grep + что-то еще здесь.

awk '$0~/xyz/{ //your code goes here}' abc.txt

8
Julien Grenier

Часто порядок обработки не имеет значения. GNU Параллельно сделано для этой ситуации:

grep xyz abc.txt | parallel echo do stuff to {}

Если вы обрабатываете больше похоже на:

grep xyz abc.txt | myprogram_reading_from_stdin

и myprogram медленный, тогда вы можете запустить:

grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin
0
Ole Tange