несколько подстановочных знаков grep последовательно

#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