logo
Published on

Bashで複数のコマンドの出力を1つの出力にまとめる

Authors

Linuxパソコン・サーバーでのコマンドライン言語Bashにおいて、複数のコマンドの出力を1つの出力にまとめる、また反対に、1つの出力を複数のコマンドに渡す、ということをする方法について紹介します。

コンソールが数千行の出力で汚くなるのは嫌ですよね。 僕は、出力がどれくらいあるのかわからない場合、とりあえずtail -3をするようにしています。もしくは、head -3,または,wcでもいいでしょう。

でも、headとtailを両方やりたい場合とかもありますよね。実際そういう場面って結構あります。headとtailとwcが同時にできたら良いですよね。

(2021年追記: lessが一番よいです。)

1つの出力を複数のコマンドに渡す

cat > hoge.md
hoge
fuga
foo
bar
# cat hoge.md | (head -3; tail -3) # => NG

cat hoge.md | tee >(head -1) >(tail -1)
hoge
fuga
foo
bar
hoge
bar  

# => 通常のcatでの出力に加えて、headとtailの出力がそれぞれ後付けされています。

cat hoge.md | tee >(head -1) >(tail -1) 2>&1 1>/dev/null
hoge
bar

# => catの出力を消して、headとtailの出力のみ出力する。

cat hoge.md | tee >(head -1 | wc) >(tail -1 >/dev/null ) 2>&1 1>/dev/null
1 1 5

# => head|wcの出力のみ出力される。

shell - How can I send stdout to multiple commands? - Unix & Linux Stack Exchange

複数のコマンドを1つの出力にまとめる

蛇足的になりますが、複数のコマンドをまとめてやるということもできるみたいです。

$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz
bash - Pipe multiple commands into a single command - Stack Overflow