#awk #sed #grep
#awk #sed #grep
Вопрос:
Пример:
У меня есть скрипт
grep "foo" /home/user_a/*/*_test >> list
grep -o "bar" /home/user_b/*/*_word >> list
printf "n" >> list
Как мне запустить оба grep, чтобы * был на одной итерации?
Предполагая, что все файлы под /home/user_a
имеют только строку «foo» и «bar» для файлов под /home/user_b
Как получить это:
foobar
foobar
foobar
Вместо:
foofoofoobarbarbar
Мы можем думать о подстановочном знаке как о цикле for, повторяющем все сопоставленные файлы.
Вместо того, чтобы ждать завершения первого grep перед запуском второго grep, первый grep останавливается при первом повторном запуске и переходит ко второму grep и получает первый результат, а затем снова возвращается к первому grep и так далее..
Комментарии:
1. Спасибо, что показали свои усилия в вашем вопросе. Не могли бы вы, пожалуйста, добавить образцы ввода также в свой вопрос, чтобы сделать его более понятным, и дайте нам знать тогда.
2. Я добавил некоторые изменения, дайте мне знать, если вам нужно больше разъяснений. Спасибо.
Ответ №1:
Если вы хотите чередовать вывод двух команд, в данном случае grep
команд, то используйте paste
вот так:
paste <(grep -h "foo" /home/user_a/*/*_test) <(grep -ho "bar" /home/user_b/*/*_word)
Поскольку вам, похоже, не нужны имена файлов в выходных данных, я добавил -h
опцию к обеим командам grep.
Более простой пример
Чтобы увидеть, как paste
комбинируется вывод двух разных команд, попробуйте следующее:
$ paste <(echo a; echo b) <(echo 1; echo 2)
a 1
b 2