Bash 具有可变数量子壳的子壳输入
Bash subshell input with variable number of subshells
我想从可变数量的日志文件中提取 grep
行,并将它们的输出与 paste
连接起来。如果我有固定数量的输出,我可以这样做:
paste <(grep $PATTERN $FILE1) <(grep $PATTERN $FILE2)
但是有没有办法对可变数量的输入文件执行此操作?我想编写一个 shell 脚本,其参数是输入文件。 shell 脚本应该 paste
来自所有这些行的 grepped 行。
您可以通过组合 find
命令列出文件并将其输出通过管道传输到 grep 使用 xargs
以确保 grep 应用于 find
命令中列出的每个文件来做到这一点
$ find /dir/containing/files -name "file.*" | xargs grep $PATTERN
使用显式命名管道,而不是进程替换。
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
我想从可变数量的日志文件中提取 grep
行,并将它们的输出与 paste
连接起来。如果我有固定数量的输出,我可以这样做:
paste <(grep $PATTERN $FILE1) <(grep $PATTERN $FILE2)
但是有没有办法对可变数量的输入文件执行此操作?我想编写一个 shell 脚本,其参数是输入文件。 shell 脚本应该 paste
来自所有这些行的 grepped 行。
您可以通过组合 find
命令列出文件并将其输出通过管道传输到 grep 使用 xargs
以确保 grep 应用于 find
命令中列出的每个文件来做到这一点
$ find /dir/containing/files -name "file.*" | xargs grep $PATTERN
使用显式命名管道,而不是进程替换。
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