※この記事は専門学校の講義用に作成されたものです
今回はコマンドラインの醍醐味である「リダイレクト」と「パイプ」について取り上げます。これをマスターすると上級者になった気分が味わえます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<>ポンチャック<>李博士<>3月6日投稿動画<>俺たちの韓流<>巡礼<>最古の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<>3月6日投稿動画<>Do_Your_Best<>sm1019→<>←sm1001 1173132706 flv 255 12118210 11679391 sm1019 アイドルマスター 高槻やよい ある日のπタッチ idolm@ster やよい πタッチ mylist/17534175 19722 782 75 高槻やよい<>←sm1018<>sm1024→<>アイマス<>アイドルマスター<>3月6日投稿動画 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 2020年 10月 25日 日曜日 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 2020年 10月 25日 日曜日 21:34:41 JST 2020年 10月 25日 日曜日 21:35:54 JST 2020年 10月 25日 日曜日 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