Ввод подоболочки Bash с переменным количеством подоболочек

Я хочу grep строк из переменного количества файлов журнала и соединить их выводы с paste. Если бы у меня было фиксированное количество выходов, я мог бы сделать это так:

paste <(grep $PATTERN $FILE1) <(grep $PATTERN $FILE2)

Но есть ли способ сделать это с переменным количеством входных файлов? Я хочу написать сценарий оболочки, аргументами которого являются входные файлы. Сценарий оболочки должен paste извлекать строки из ВСЕХ из них.


person JellicleCat    schedule 06.08.2018    source источник
comment
Grep примет список файлов, возможно, подстановочный знак сделает то, что вам нужно? вы можете добавить в файл, используя канал append >>, поэтому удалите вывод, а затем запустите свои greps в цикле, каждый из которых добавляется к файлу?   -  person Gem Taylor    schedule 06.08.2018


Ответы (2)


Используйте явные именованные каналы вместо подстановки процессов.

pipes=()
for f in "$FILE1" "$FILE2" "$FILE3"; do
    n="$(mktemp)"  # Or some other command to create a temporary name
    mkfifo "$n"
    pipes+=( "$n" )
    grep "$PATTERN" "$f" > "$n" &
done

paste "${pipes[@]}"
rm  "${pipes[@]}"   # When done with them
person chepner    schedule 06.08.2018

Вы можете сделать это, комбинируя команду find для вывода списка файлов и направляя ее вывод в grep с помощью xargs, чтобы обеспечить применение grep к каждому файлу, указанному в команде find.

$ find /dir/containing/files -name "file.*" | xargs grep $PATTERN
person rajeshnair    schedule 06.08.2018
comment
Однако это не использует вывод каждого grep в качестве входного файла для paste. - person chepner; 06.08.2018