【Linux】|,grep,curl,seq,xargs,sed,;の解読

f:id:hira98:20190721142342p:plain

【結論】

  • curlコマンドを使えば、HTTPリクエストを投げることができる。
  • |を使えばコマンドの実行結果を次のコマンドに渡すことができる。
  • その際に、xargsコマンドを実行すれば、受け取った結果を引数として特定のコマンドを実行することができる。
  • grepコマンドを使えば、指定した文字列がヒットする行だけを表示することができる。
  • さらに、その結果をsedコマンドに渡せば特定の文字列を抜き出すことができる。
  • seqコマンドを使えば、任意の数字を出力できる。
  • コマンドの末尾に;を付ければ、1行で複数コマンド実行できる。

【目次】

はじめに

前回、Linuxコマンドを駆使してハテナブログに投稿した記事のURLとタイトル一覧を取得するコマンドを書きました。

hira98.hatenablog.com

今回は、上記で使用した呪文を解読していきます。

|について

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

seqtouchコマンドを|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

seqxargsを駆使して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/' # ダブルクォーテーションの場合

引用:https://qiita.com/teru__san/items/fe89c4f37633b6841ce0

;について

コマンドの末尾を表す記号です。

1回の実行で1コマンドしか実行しない時は省略可能ですが、1回の実行で複数のコマンドを実行したい場合に使用します。

ハテナブログの記事一覧は1ページで30記事分しか表示されないため、6月など31日まである場合2ページに分かれて表示されてしまいます。

しかし、Linuxコマンドで「次へボタンがある場合はリンク先のページも確認する。」といった器用なことはできません。

苦肉の策として、1から12ヶ月全てが2ページあることにして、各月2回HTTPリクエストを投げたいた固めに;を使っています。

参考情報

sedでダブルクォーテーションの中にある文字列を抽出する - Qiita

さいごに

複雑に見える呪文も細かく分解して、一つ一つ理解していけば大した事はない😤