【Linux】|,grep,curl,seq,xargs,sed,;の解読
【結論】
curl
コマンドを使えば、HTTPリクエストを投げることができる。|
を使えばコマンドの実行結果を次のコマンドに渡すことができる。- その際に、
xargs
コマンドを実行すれば、受け取った結果を引数として特定のコマンドを実行することができる。 grep
コマンドを使えば、指定した文字列がヒットする行だけを表示することができる。- さらに、その結果を
sed
コマンドに渡せば特定の文字列を抜き出すことができる。 seq
コマンドを使えば、任意の数字を出力できる。- コマンドの末尾に
;
を付ければ、1行で複数コマンド実行できる。
【目次】
はじめに
前回、Linuxコマンドを駆使してハテナブログに投稿した記事のURLとタイトル一覧を取得するコマンドを書きました。
今回は、上記で使用した呪文を解読していきます。
|
について
Linuxコマンドにおいて、|
はコマンドの実行結果を次のコマンドに渡すつなぎの役割をしてくれます。
よく使う例は、grep
コマンドと組み合わせて、出力結果をフィルタリングするケースです。
ファイルを開くcat
コマンドだけを実行すると、次のようにファイルの内容を全て表示します。
$ cat fruit_list.txt apple banana orange lemon melon bash-3.2
しかし、cat
の結果を|
を介してgrep
コマンドに渡すことでフィルタリングすることができます。
$ cat fruit_list.txt | grep a apple banana orange
上記方法は、cat
だけでなく、実行結果をフィルタリングしたいケースで汎用的に使えます。
HTTPリクエストを投げるcurl
と組み合わせることで、簡易スクレイピングも実装できます。
(実行結果は簡略化して記載しています。)
$ curl https://hira98.hatenablog.com/archive/2019/6 | grep "entry-title-link" <a class="entry-title-link" href="url">ブログのタイトル1</a> <a class="entry-title-link" href="url">ブログのタイトル2</a> <a class="entry-title-link" href="url">ブログのタイトル3</a> 〜〜省略〜〜
xargs
について
|
を使うとコマンドの実行結果を全て渡してしまいます。
grep
でフィルタリングするだけであれば特に問題ありません。
しかし、実行するコマンドに指定する引数の一部として利用するケースでは、|
だけでは役不足です。
そんな時に使うのが、xargs
コマンドです。
使用例を示すために、たとえば1〜Nの連番がついたファイルを作成したいとします。
連番を出力するには、seq
コマンドを使います。
$ seq 5 1 2 3 4 5
ファイル作成はtouch
コマンドを使います。
$ touch ブログ.md $ ls ブログ.md
seq
とtouch
コマンドを|
とxargs
を使ってつないであげることで、1〜Nの連番がついたファイルを作成できます。
$ seq 5 | xargs -I@ touch ブログ_@.md $ ls ブログ_1.md ブログ_2.md ブログ_3.md ブログ_4.md ブログ_5.md
xargs -I@
と指定することで、以降ではseq 5 |
で受け取った結果(1〜5の文字)を@
記号として扱います。
結果、touch ブログ_@.md
には1〜5の文字になった状態で実行されます。
要は、以下のコマンドを実行したのと同じ結果を一回のコマンドを実行するだけで得ることができます。
$ touch ブログ_1.md $ touch ブログ_2.md $ touch ブログ_3.md $ touch ブログ_4.md $ touch ブログ_5.md
seq
とxargs
を駆使してURLの一部を変更しながらcurl
コマンドを実行することで、12ヶ月分のブログ一覧を取得できます。
$ seq 12 | xargs -I@ curl https://hira98.hatenablog.com/archive/2019/@?page=1 | grep "entry-title-link"
sed
について
ざっくり言うと、正規表現を使って文字列の一部を抜き出すためのコマンドです。
sed
を使えば、以下のファイル(hoge.txt)を
<a class="entry-title-link" href="url1">ブログのタイトル1</a> <a class="entry-title-link" href="url2">ブログのタイトル2</a> <a class="entry-title-link" href="url3">ブログのタイトル3</a>
次ように置換することができます。
url1,ブログのタイトル1 url2,ブログのタイトル2 url3,ブログのタイトル3
この処理を行うには、次のsed
コマンドを実行すればいいだけです。
$ cat hoge.txt | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/'
…sed
コマンドの呪文に触れると記事が長くなりそうなので、解読は次回にします。
ぶっちゃけ、以下を参考にして、色々試してたらなんか上手くできた🎉程度しか理解できていないです💦
sed 's/^.*"\(.*\)".*$/\1/' # ダブルクォーテーションの場合
;
について
コマンドの末尾を表す記号です。
1回の実行で1コマンドしか実行しない時は省略可能ですが、1回の実行で複数のコマンドを実行したい場合に使用します。
ハテナブログの記事一覧は1ページで30記事分しか表示されないため、6月など31日まである場合2ページに分かれて表示されてしまいます。
しかし、Linuxコマンドで「次へボタンがある場合はリンク先のページも確認する。」といった器用なことはできません。
苦肉の策として、1から12ヶ月全てが2ページあることにして、各月2回HTTPリクエストを投げたいた固めに;
を使っています。
参考情報
sedでダブルクォーテーションの中にある文字列を抽出する - Qiita
さいごに
複雑に見える呪文も細かく分解して、一つ一つ理解していけば大した事はない😤