順番に読み進めながら学べます

パイプ — コマンドの連結

前のコマンドの出力を次へ渡す仕組みと、wc -lで行数、sortで並べ替え、sortとuniqで重複をまとめる定番の連結を、ブラウザ端末で操作しながら学べます。

パイプとは — | の意味

パイプ|は、前のコマンドの出力をそのまま次のコマンドの入力として渡す記号です。

1 つのコマンドの結果を別のコマンドで加工することで、小さなコマンドを組み合わせて目的を達成できます。

これは複数の単機能ツールをつないで処理を組み立てる Unix の設計思想です。

出力が次の入力へ流れる
cat fruits.txt|wc -l3 行の中身を出力出力を入力へ渡す受け取って行数 3 を表示
|は左の出力を右の入力へ渡し、単機能のコマンドを連結します。
echo apple > fruits.txt      # 1 行目を作成
echo banana >> fruits.txt    # 追記
echo cherry >> fruits.txt    # 追記
cat fruits.txt | wc -l       # 行数を数える -> 3
ls / | wc -l                 # ルート直下の項目数

echo apple > fruits.txtで 1 行目を作り、echo banana >> fruits.txtecho cherry >> fruits.txtを追記して 3 行の素材ファイルを作成してください。

cat fruits.txtの出力をパイプでwc -lに渡し、行数が表示されることを確認してください。

③ 表示された数字が素材の行数と合っていることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 4 実行済み
Loading Linux Terminal...

つなぐ相手は何でもよい

パイプは特定のコマンド専用ではありません。

標準出力を出すコマンドと、標準入力を受け取れるコマンドであれば自由につなげます。

ls | wc -lでファイル数、cat ファイル | sortで並べ替えなど、組み合わせは無数にあります。

echo log1 > lines.txt    # 1 行目を作成
echo log2 >> lines.txt   # 追記
echo log3 >> lines.txt   # 追記
cat lines.txt | wc -l    # 3
ls /etc | wc -l          # /etc の項目数

echo x > items.txtで 1 行目を作り、echo y >> items.txtecho z >> items.txtを追記して 3 行の素材を作成してください。

cat items.txtの出力をパイプでsortへ渡し、行が辞書順に並べ替わって表示されることを確認してください。

③ 続けてcat items.txtの出力をsortに渡し、さらにその結果をもう 1 本のパイプでwc -lへつなぐ 3 段のパイプを実行し、行数が表示されることを確認してください。

Linux console
0 / 5 実行済み
Loading Linux Terminal...
コマンドパイプでの役割
|左の出力を右の入力へ渡す
wc -l受け取った行数を数える
sort受け取った行を辞書順に並べ替える
uniq隣り合う重複行を 1 行にまとめる
head / tail受け取った先頭 / 末尾だけを取り出す

並べ替える — sort

sortは受け取った行を並べ替えるコマンドです。

既定では辞書順(文字列の順)に並べ替えます。

パイプで前のコマンドの出力を受け取り、整列した結果をそのまま画面や次のコマンドへ渡せます。

sort が行を辞書順に並べ替える
cat fruits.txt|sortbanana / apple / cherry出力を入力へ渡すapple / banana / cherry に整列
sortはパイプで受け取った行を辞書順に並べ替えて出力します。
echo banana > fruits.txt     # 並びをばらばらに作る
echo apple >> fruits.txt
echo cherry >> fruits.txt
cat fruits.txt | sort        # apple / banana / cherry に並ぶ

echo banana > fruits.txtで 1 行目を作り、echo apple >> fruits.txtecho cherry >> fruits.txtを追記して、順不同の 3 行を作成してください。

cat fruits.txtの出力をパイプでsortへ渡し、行が辞書順に並べ替わって表示されることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

重複をまとめる — uniq

uniqは連続して重複する行を 1 行にまとめるコマンドです。

uniqは隣り合った行だけを見るため、離れた場所にある同じ行はまとめられません。

重複を確実に 1 行にしたいときは、先にsortで同じ行を隣へ集めてからuniqへつなぐsort | uniqが定番です。

sort で隣に集めて uniq でまとめる
cat list.txtsortuniqpear / apple / pear の 3 行apple / pear / pear に並ぶapple / pear に減る
sortで重複を隣に集め、uniqで連続した重複を 1 行にまとめます。
echo pear > list.txt         # 重複を含む素材を作る
echo apple >> list.txt
echo pear >> list.txt
cat list.txt | sort          # apple / pear / pear
cat list.txt | sort | uniq   # apple / pear

uniq の前に sort

uniq隣り合った行だけを重複として見ます。

離れた場所にある同じ行はまとめられないため、重複を 1 行にしたいときは先にsortで並べ替えてからuniqにつなぎます。

echo pear > list.txtで 1 行目を作り、echo apple >> list.txtecho pear >> list.txtを追記して、重複を含む 3 行を作成してください。

cat list.txtの出力をパイプでsortに渡し、同じ行が隣り合うように並べ替えてください。

③ さらにその出力をuniqへつなぎ、隣り合った重複が 1 行にまとまることを確認してください。

Linux console
0 / 5 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1パイプ|は何をする記号ですか?

Q2cat fruits.txt | wc -lを実行すると何が表示されますか?

Q3重複した行を 1 行にまとめたいとき、uniqの前につなぐと効果的なコマンドはどれですか?