Вы можете сделать следующее 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 с read.
В приведенном выше сценарии IFS = предотвращает обрезку начальных и конечных пробелов. Удалите его, если хотите этот эффект.
Что касается подстановки процесса, это объясняется на странице bash hackers :
Подстановка процесса - это форма перенаправления, в которой ввод или вывод процесса (некоторая последовательность команд) отображается как временный файл.
grep -o
для такого рода вещей.-o
Флаг будет возвращать только текст , который соответствует, с одной спички на линии выхода. (Он не является исчерпывающим, поэтомуecho aaa |grep 'a*'
дает только «ааа» и пропускает три частичных совпадения »,« а »и« аа »)