8. Learning the shell — Lesson 7: I/O Redirection
【所要時間】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.txt1.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.txt1.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.txt1.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.txt1.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.txt1.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のところで使った。)
・一つずつコマンド試していたらとても時間がかかってしまったが、試すことで理解できたコマンドがたくさんあった。