Есть ли способ передать вывод команды cat, awk, sed, et c, строка за строкой в команду?
Сложные команды можно поместить в канал синтаксис не очень строг. Обычное:
awk 'some awk script' |
while IFS= read -r line; do
echo "$line"
done |
sed 'some sed script'
Я стараюсь не читать строку ввода построчно, используя while read
- это очень медленно. Использовать awk
сценарии и другие команды намного быстрее.
Группы команд можно использовать для:
awk 'some awk script' |
{ # or '(', but there is no need for a subshell
echo "header1,header2"
# remove first line
IFS= read -r first_line
# ignore last line
sed '$d'
} |
sed 'some sed script'
Помните, что команда pipe запускается в подоболочке, поэтому изменения переменных не будут влияет на родительскую оболочку.
Bash имеет расширение замещения процесса, которое позволяет вам некоторое время запустить l oop внутри родительской оболочки:
var=1
while IFS= read -r line; do
if [[ "$line" == 2 ]]; then
var=2
fi
done <(
seq 10 |
sed '$d'
)
echo "$var" # will output 2