Linux入門「はじめてのコマンドライン」- Part.3

※この記事は専門学校の講義用に作成されたものです

今回はコマンドラインの醍醐味である「リダイレクト」と「パイプ」について取り上げます。これをマスターすると上級者になった気分が味わえますw

これまでのお話

前回からの続きになります。各ページの内容を理解した上でご覧ください。 blog.katsubemakito.net blog.katsubemakito.net

リダイレクト

ファイルの行数を数える

今回はニコニコ動画の動画リストを50万件保存した「video.csv」というファイルを用意しました。データは国立情報学研究所から配布されている物を元に生成しました。

最初に本当に50万件あるか数えてみましょう。ファイルの行数をカウントするにはwcコマンドを利用します。

[neec@localhost ~]$ cd Documents
[neec@localhost Documents]$ wc -l video.csv
500000 Documents/video.csv

ファイルの一部を表示する

実際にどのようなデータが入っているか中身を覗きます。catコマンドで簡単に……と、ここで手を止めた方はするどい。さすがに50万件をすべてTerminalへ表示するのは過酷すぎます。いや、表示自体はできるのですが、すごい勢いで流れるデータを数分間眺め続ける羽目になります。

そこでLinuxにはテキストファイルの一部を取り出すコマンドが存在します。

先頭から取り出す - head

ファイルの先頭から10行だけを取り出すにはheadコマンドを実行します。

[neec@localhost Documents]$ head video.csv
sm1001  李博士 ポンチャックディスコ  かの国で、この人の才能だけは認めたい。この動画は、1001番目に投稿されたらしいです。巡礼者の皆さん、いらっしゃいませ、そして、お気をつけて。 13137   356 114     ←sm999<>sm1018→<>k-pop<>ポンチャック<>李博士<>36日投稿動画<>俺たちの韓流<>巡礼<>最古の4<>最古のk-pop  1173132610  flv 384 15860960    15622973
sm1018  VIPPERです(Do Your Best)  VIPPERによる替え歌吹き替えです。4作目。他の吹き替えにはvipper吹き替えタグからどうぞ<br />VIPPERです全員verできました→sm2266593 今まで田中美奈子!    266210  16566   3864        テニミュ<>VIPPERです<>vipper吹き替え<>歌ってみた<>vip<>36日投稿動画<>Do_Your_Best<>sm1019→<>←sm1001    1173132706  flv 255 12118210    11679391
sm1019  アイドルマスター 高槻やよい ある日のπタッチ idolm@ster やよい πタッチ mylist/17534175 19722   782 75      高槻やよい<>←sm1018<>sm1024→<>アイマス<>アイドルマスター<>36日投稿動画   1173132649  flv 129 6175566 6024034
(中略)

以下のように-(取り出したい行数)とすることで、指定した行数を取り出せます。以下では5行としていますが、100行などデフォルトよりも多く取り出すことも可能です。

[neec@localhost Documents]$ head -5 video.csv

最後から取り出す - tail

ファイルの最後から10行を取り出すことも可能です。tailコマンドを実行します。

[neec@localhost Documents]$ tail video.csv 
sm2558776   YNGWIE MALMSTEEN (8)    http://nobupon.ame-zaiku.com/1990年Eclipseツアー福岡サンパレス公演、8曲目Far Beyond The Sunです。by のぶさんとぽんさん  138326  10  音楽  yngwie<>音楽<>メタル<>Yngwie_Malmsteen<>Live<>イングヴェイ 1204927112  flv 525 20760575    20375561
sm2558788   【らき☆すたラジオ】新らっきー☆ちゃんねる *10背景 2代目背景です。 wiiさんは今週来ないって聞きましたが・・・あれ?<br />公開録音の応募の結果通知で、当選通知が来た人はいるのでしょうか…?<br />・今回の音源はノイズが激しいので各自調整をお願いします。<br /><br />パーソナリティ:小神あきら(今野 宏美) 白石みのる(白石 稔) 日下部みさお(水原 薫) <br />音源はsm2554915より。 今までの回⇒mylist/4113717 第9回⇒sm2479264 第11回⇒sm2651906 らっきー☆ちゃんねるコミュ⇒co2787   340784740   183 ラジオ 今野宏美の消失<>ラジオ<>らっきー☆ちゃんねる<>新らっきー☆ちゃんねる<>らき☆すた<>パプ☆リカ<>ヴィ<>エンドレス掃除機   1204927466  flv 17263
(中略)

headと同様に-(取り出したい行数)とすることで、指定した行数を取り出すこともできます。

headの実行結果を保存する

head(tail)コマンドの実行結果はそのままではTerminal上に表示されるだけで、二次利用することができません。

例えば巨大なファイルをEXCELなどの表計算ソフトで開くとめっちゃ時間がかかります。そんな大量のデータは必要ない、最初の100件だけで良いといった場合に、head(tail)の実行結果が保存できれば便利ですよね。

そんなときに利用するのがリダイレクトです。 やり方は簡単です。コマンドの最後に>と保存したいファイル名を書くだけ。以下のように実行するとvideo.csvの先頭100件のデータをvideo_top100.csvというファイルに保存することができます。

[neec@localhost Documents]$ head -100 video.csv > video_top100.csv

念の為wcコマンドで件数を確認します。

[neec@localhost Documents]$ wc -l video_top100.csv
100 video_top100.csv

表計算ソフトなどでvideo_top100.csvを開いて、実際に100件だけ保存されているか確認してみましょう。

リダイレクトで追記する

非常にシンプルでわかりやすいリダイレクトですが、同名のファイルがある場合は上書き保存される点に注意が必要です。実行する度にファイルを真っ白にしてから書き込みが行われます。

以下のように3回リダイレクトして保存したつもりが、最後の1回だけしか保存されていないのがわかります。

[neec@localhost Documents]$ date > time.txt
[neec@localhost Documents]$ date > time.txt
[neec@localhost Documents]$ date > time.txt

[neec@localhost Documents]$ cat time.txt
20201025日 日曜日 21:34:41 JST

もし上書き保存されたくない、ファイルにどんどん追記していきたいといった場合には > の箇所を >> としてやります。今度は3回とも記録されました。

[neec@localhost Documents]$ date >> time.txt
[neec@localhost Documents]$ date >> time.txt
[neec@localhost Documents]$ date >> time.txt

[neec@localhost Documents]$ cat time.txt
20201025日 日曜日 21:34:41 JST
20201025日 日曜日 21:35:54 JST
20201025日 日曜日 21:35:55 JST

パイプ

ファイル内を検索する - grep

cat, head, tailコマンドは、基本的にファイルをそのまま表示してくれました。しかし特定の条件に合致した行だけを取り出したいといったこともよくありますよね。そんな時に利用するのがgrepコマンドです。

以下のコマンドでvideo.csvの中にある「アイドルマスター」が含まれる行だけを取り出すことができます。

[neec@localhost Documents]$ grep 'アイドルマスター' video.csv

Terminalでは分かりやすいようにハイライトしてくれます。

grepの検索結果を数える

grepの検索結果を数えるにはどうすれば良いでしょう?

ここまでやってきた内容だけで行うには以下のように実行すれば実現できます。

[neec@localhost Documents]$ grep 'アイドルマスター' video.csv > video_aimasu.txt
[neec@localhost Documents]$ wc -l video_aimasu.txt
20225 video_aimasu.txt

上記の方法でも問題はありませんが、「パイプ」を使えばもっとスマートに記述することができます。

[neec@localhost Documents]$ grep 'アイドルマスター' video.csv | wc -l
20225

このようにLinuxコマンドラインではパイプ記号(|)で2つのコマンドを連結させることができます。

ファイルの先頭1000件だけを対象にする

応用してみましょう。 パイプで結合できるのは2つだけではありません。基本的に何個でも連結させることができます。以下のコマンドを実行すると、video.csvの先頭1000件の中から検索を行い、その結果を数えてくれます。

[neec@localhost Documents]$ head -1000 video.csv | grep 'アイドルマスター' | wc -l
82

このようにパイプ記号(|)でコマンドを連結させる際には、何個でも組み合わせることができるのです。

リダイレクトとパイプを組み合わせる

本日学習したリダイレクトとパイプの2つを組み合わせて使うことももちろん可能です。

[neec@localhost Documents]$ head -1000 video.csv | grep 'アイドルマスター' > video_aimasu.csv

続き

blog.katsubemakito.net