8. Learning the shell — Lesson 7: I/O Redirection

Tatsuya Asami
11 min readJun 30, 2018

--

【所要時間】3時間46分(2018年6月30日)

【概要】

input/output redirectionを学ぶ。

【要約・学んだこと】

・Standard Output

結果を表示する大半のcommand line programsは、standard outputに結果を送信することで、結果を表示する。
デフォルトではstandard outputは中身を表示するように指示する。standard outputをredirectするためには、”>” が使われる。

Tats-MacBA-3:my_dir AsamiTasuya$ ls
1.bak 2.bak 3.bak
Tats-MacBA-3:my_dir AsamiTasuya$ ls > file_list.txt
Tats-MacBA-3:my_dir AsamiTasuya$ ls
1.bak 2.bak 3.bak file_list.txt
Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt

1.bak
2.bak
3.bak
file_list.txt
file_list.txt (END)

directory my_dirに”file_list.txt” というファイルが作成された。
中身は”ls”コマンドで表示される内容と同じ内容が記載されている。
つまり”ls”コマンドの結果がディスプレイに表示されずに、”file_list.txt”に書かれた。

“ls >”だとファイルリストは上書きされるが、”ls >>”だと追加される。

Tats-MacBA-3:my_dir AsamiTasuya$ ls >> file_list.txt
Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt

1.bak
2.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
(END)

追加で表示された。

“ls >”でもう一度上書きして見ると

Tats-MacBA-3:my_dir AsamiTasuya$ ls > file_list.txt
Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt

1.bak
2.bak
3.bak
file_list.txt
file_list.txt (END)

最新の結果のみに上書きされた。もしファイルがない場合は、新たにファイルが作成される。
“file_list2.txt”ファイルが存在しない状態で”ls >> file_list2.txt”を作成すると

Tats-MacBA-3:my_dir AsamiTasuya$ ls >> file_list2.txt
Tats-MacBA-3:my_dir AsamiTasuya$ less file_list2.txt

1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list2.txt (END)

新たに”file_list2.txt”が作成され、その中にdirectoryのファイル一覧が記載された。

・Standard Input

大半のコマンドはStandard inputからのインプットを受け入れる。デフォルトではstandard inputはキーボードからコンテンツを取得するが、standard outputと同様に、リダイレクトから受け取ることもできる。standard inputをキーボードの代わりにファイルから入力するには”<”が使われる。

Tats-MacBA-3:my_dir AsamiTasuya$ sort < file_list.txt
1.bak
2.bak
3.bak
file_list.txt

“sort”コマンドが”file_list.txt”のコンテンツに指示された。結果はstandard outputの指示がないので、通常通りterminalに表示された。

結果を新規作成の”sorted_file_list.txt”ファイルにstandard output するようリダイレクトすると

Tats-MacBA-3:my_dir AsamiTasuya$ sort < file_list.txt > sorted_file_list.txt
Tats-MacBA-3:my_dir AsamiTasuya$ less sorted_file_list.txt

1.bak
2.bak
3.bak
file_list.txt

結果は”sorted_file_list.txt”に記載された。

redirectの順番は関係がない。唯一の要件は、redirection operators(”<”と”>”)は、他のコマンドのoptionsとargumentsの後になければならない点である。

・Pipelines

pipelinesでは一つのstandard outputコマンドが別のstandard inputに供給される。

Tats-MacBA-3:~ AsamiTasuya$ ls -l | less

drwx — — — @ 6 AsamiTasuya staff 192 Jan 12 2016 OneDrive
drwx — — — + 50 AsamiTasuya staff 1600 May 12 22:41 Pictures
drwxr-xr-x+ 6 AsamiTasuya staff 192 Dec 24 2016 Public
drwx — — — 3 AsamiTasuya staff 96 Jun 28 2017 VirtualBox VMs
-rw-r — r — 1 AsamiTasuya staff 491 May 22 2017 signed_22a74ba1.txn
-rw-r — r — 1 AsamiTasuya staff 0 Jun 27 16:47 test1
(END)

“ls -l”の結果が一画面ずつ表示された。(↓キーで画面に入りきらない結果がスクロールできた。)

・Filters

filtersはpipelinesでよく使われるコマンドの1つ。filtersはstandard inputを受け取り、操作を実行し、結果をstandard outputに送る。

・”sort” :
standard inputをソートして、その結果をstandard output する。“sorted_file_list.txt”にランダムに数字を入力してみる。

Tats-MacBA-3:my_dir AsamiTasuya$ less sorted_file_list.txt

1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
sorted_file_list.txt
3
4
5
2
7
100
30
sorted_file_list.txt (END)

上記のようになっている状態で、”sort”を実行すると

1.bak
100
2
2.bak
3
3.bak
30
4
5
7
file_list.txt
file_list2.txt

名前順になって表示された。

・”uniq” :
standard inputからソートされたデータストリームが与えられる場合、重複したデータの行が取り除かれる。

Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt

1.bak
2.bak
3.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list_txt
sorted_file_list.txt

“3.bak” というのをもう一つ作ってみた。
このファイルを”uniq”で実行すると

Tats-MacBA-3:my_dir AsamiTasuya$ uniq file_list.txt
1.bak
2.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list_txt
sorted_file_list.txt

“3.bak”が一つになった。

・”grep” :
standard inputから受け取った各行のデータを調べ、指定された文字パターンを含む全ての行を出力する。

“1”を指定してみると、

Tats-MacBA-3:my_dir AsamiTasuya$ grep 1 file_list.txt
1.bak
1.bak

“1”を含むファイルのみが表示された。

・”fmt”:
standard inputからテキストを読み、standard outputにテキストを表示する。

Tats-MacBA-3:my_dir AsamiTasuya$ fmt file_list.txt
1.bak 2.bak 3.bak 3.bak file_list.txt 1.bak 2.bak 3.bak file_list.txt
file_list2.txt file_list_txt sorted_file_list.txt

“file_list.txt”の中身が表示された。

・”head”
inputした最初の数行をoutputする。ヘッダーファイルを取得するときに役に立つ。

Tats-MacBA-3:my_dir AsamiTasuya$ head file_list.txt
1.bak
2.bak
3.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
file_list2.txt

最初の10行が表示された。

・”tail” :
inputの最後数行をoutputする。ログファイルから最新のentriesを取得するときに役立つ。

Tats-MacBA-3:my_dir AsamiTasuya$ tail file_list.txt
3.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list_txt
sorted_file_list.txt

最後の10行が表示された。

・”tr” :
文字を変換する。大文字を小文字に変えたり、末尾を変えたりする際に使える。
このtxtファイル↓

Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt

1.bak
2.bak
3.bak
3.bak
file_list.txt
1.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list_txt
sorted_file_list.txt
file_list.txt (END)

にある”1"を”z”に変える。

Tats-MacBA-3:my_dir AsamiTasuya$ less file_list.txt | tr 1 z
z.bak
2.bak
3.bak
3.bak
file_list.txt
z.bak
2.bak
3.bak
file_list.txt
file_list2.txt
file_list_txt
sorted_file_list.txt

“1”が”z”となって表示された。

・”sed” :
Stream EDitorのこと。”tr”よりもより洗練されたテキスト変換ができる。
ちょっとよくわからなさそうだったので飛ばします。

・”awk” :
filterを構成するために作られた言語。とても強力。
こちらもわからなさそうだったので飛ばします。

・Performing tasks with pipelines

1. Printing from the command line

Linuxは”lpr”というstandard inputを受け入れ、それをプリンターに送信するプログラムを提供している。

cat poorly_formatted_report.txt | fmt | pr | lpr

このコマンドの意味は

→catがファイルを読み、standard outputに出力し、fmtのstandard inputに繋がれる。
→fmtはtxtをきちんとしたパラグラフにし、standard outputに出力し、prのstandard inputに繋がれる。
→prはテキストをpagesにきちんと分割し、lprのstandard inputに繋がれる。
→lprはstandard inputを受け取り、プリンターに送信する。

2. Viewing the contents of tar files

gzipped tar fileというのは、Unix形式のtape archive file(tarで作られる)で、gzipで圧縮されたfileである。
“.tar.gz”や”.tgz”の拡張子で認識できる。下記のコマンドを使えば、Linuxシステムでこれらのファイルが表示できる。

tar tzvf name_of_file.tar.gz | less

【わからなかったこと】

・Filtersの項目の”sed”と”awk”の使い方。調べるととてもたくさん出てきたのでパスした。

【感想】

・Ctrl-Cでコマンドを中止できる。(Filterのところで使った。)
・一つずつコマンド試していたらとても時間がかかってしまったが、試すことで理解できたコマンドがたくさんあった。

--

--

Tatsuya Asami
Tatsuya Asami

Written by Tatsuya Asami

Front end engineer. React, TypeScript, Three.js

Responses (1)