つなぐ

INPUT · スライド

パイプでつなぐ(`|`)

01 / 07

ファイルを経由しないでつなぐ

ここまでのやり方だと、2つの道具を組み合わせるにはファイルが要ったよね。

```
sort kudamono.txt > temp.txt
uniq temp.txt
rm temp.txt
```

いちいち置き場を作って、使って、片づける。面倒だし、名前を考えるのも無駄だよ。

パイプ(|)を使えば、ファイルを作らずに直接つなげるんだ。

```
sort kudamono.txt | uniq
```

02 / 07

`|` は出口と入口の直結

| は「左の出口を、右の入口につなぐ」という記号だよ。

```
コマンドA | コマンドB
```

  • A の標準出力(1 番)が
  • B の標準入力(0 番)に

直接つながるんだ。途中でディスクに書かれないので速いし、途中の名前を考えなくていい。

そして何段でもつなげるよ。3段でも5段でも同じ書き方だよ。

~ $ ls | wc -l4

03 / 07

パイプを通るのは 1 番だけ

前のレッスンで見たことをもう一度。エラー(2 番)はパイプを通らないよ。

```
ls nai.txt | wc -l # 0(エラーは通っていない)
ls nai.txt 2>&1 | wc -l # 1(合流させたので通る)
```

これは親切な作りなんだ。パイプの途中でエラーが混ざると、次の道具が変な文字を受け取って誤動作するからね。異常は人の目に、データは次の道具へという筋が通っているんだ。

04 / 07

定番の3段: 数えて多い順

いちばんよく使われる形を覚えてしまおう。「同じものがいくつあるか、多い順に」だよ。

```
sort kudamono.txt | uniq -c | sort -rn
```

1段ずつ読むとこうだよ。

1. sort … 同じものを隣どうしに集める
2. uniq -c … 隣の重なりをまとめて、頭に個数を書く
3. sort -rn … その数で大きい順(r は逆順、n は数として)

ログの集計はほぼこの形だよ。「どのエラーがいちばん多いか」「どの住所からいちばん来ているか」が、これで出るんだ。

~ $ sort kudamono.txt | uniq -c | sort -rn      3 ringo      2 mikan      1 banana

05 / 07

組み立て方は「1段ずつ足す」

長いパイプを一度に書こうとしなくていいよ。1段書いて、打って、目で見る。それを繰り返すんだ。

```
sort kudamono.txt # まず並ぶか見る
sort kudamono.txt | uniq -c # 数が付くか見る
sort kudamono.txt | uniq -c | sort -rn # 並び替わるか見る
```

この作り方には大きな利点があるよ。どこで思った通りにならなかったかが分かるんだ。

5段いっぺんに書いて結果が変だと、どの段が悪いのか分からない。1段ずつなら、直前に足した段が犯人だよ。

06 / 07

途中で止めても大丈夫

面白い実験をしてみよう。

```
yes | head -3
```

yesy無限に出し続けるコマンドだよ。でもこれは止まる。

head -3 が3行受け取って終わると、書き先が閉じたことが yes に伝わって、yes も終わるんだ。

この仕組みのおかげで、巨大なログ | head のような形が安全に使えるよ。全部読み終わるのを待たなくていいんだ。

07 / 07

さあ、打ってみよう

kudamono.txt に果物の名前が6行入っているよ。ringo が3つ、mikan が2つ、banana が1つだね。

この回では同じファイルを何度も使うよ。つなぐ段を増やしていくと、出てくるものがどう変わるかを見てほしいんだ。

新しい道具も少し出てくるよ。uniq(重なりをまとめる)、seq(数を並べる)、ps(動いているものを見る)。どれも次の章以降でくわしくやるので、ここではつなぐ相手として顔を見るだけでいいよ。