オライリー本の表紙に描かれている全動物をシェル芸でリスト化してみる(修正版)
以前に、 オライリー本の表紙に描かれている全動物をシェル芸でリスト化してみるという記事を作成しました。
しかし、元サイトの構成変更などにより、上記記事のコードが動作しない状態になっていました。
そこで今回、最新サイトに合わせて動作するように、また処理内容を(多少)分かりやすくするために、コードを書き直しました。
本記事では、オライリー社の「アニマルシリーズ」の表紙に描かれている全動物を、ワンライナーでリスト化する方法を記します。
実行環境
Arch Linux 5.15.30-1-lts
GNU bash 5.1.16(1)-release
GNU coreutils 9.1-1
grep (GNU grep) 3.7
sed (GNU sed) 4.8
curl 7.82.0
シェル芸コード
以下、シェル芸による解答です。
#!/bin/sh
curl -s https://www.oreilly.com/animals.csp | # ソースの取得
grep 'class="pagination pagination--top"' | # 最大レコード数の取得1
grep -o 'of [0-9]*' | # 最大レコード数の取得2
cut -d ' ' -f 2 | # 最大レコード数の取得3
sed 's#.*#curl -s https://www.oreilly.com/animals.csp?x-o="[0-&:20]"#' | # curlコマンドの生成
sh | # コマンドの実行
grep 'class="animal-name"' | # 動物名の抽出
sed 's/<[^<]*>//g' | # HTMLタグの除去
sed 's/^\s*//' | # 行頭の余分なスペースの除去
sort | # ソート
uniq # 重複レコードの除去
以下、コピペ実行用のワンライナーコードです。
curl -s https://www.oreilly.com/animals.csp | grep 'class="pagination pagination--top"' | grep -o 'of [0-9]*' | cut -d ' ' -f 2 | sed 's#.*#curl -s https://www.oreilly.com/animals.csp?x-o="[0-&:20]"#' | sh | grep 'class="animal-name"' | sed 's/<[^<]*>//g' | sed 's/^\s*//' | sort | uniq
コードの解説
以下、コード中のコメントでは説明しきれていない部分や、補足が必要な箇所について、解説をします。
3 ~ 7行目
この範囲のコードでは、 curl
でURLを特定数値の範囲で展開するためのコマンドを生成します。
具体的には、
curl -s https://www.oreilly.com/animals.csp?x-o="[0-1455:20]"
のようなコマンドを生成します。
上記のコマンドを生成するにあたり、まず数値範囲の末尾の値を知る必要があります。
そのため、まず curl
で対象ページの内容を取得し、その後 grep
や cut
で末尾の値を切り出していきます。
末尾値を取得できたら、 sed
を使って文字列に埋め込み、目的の curl
コマンドを生成しています。
参照Webサイト
オライリー本の表紙に描かれている全動物をシェル芸でリスト化してみる (Wed Apr 27 12:14:52 JST 2022 アクセス)
→ 本記事の元ネタhttps://www.oreilly.com/animals.csp (Wed Apr 27 12:15:18 JST 2022 アクセス)
→ O’Reilly MediaのWebサイト内にある、アニマルシリーズで使用した動物を調べられるページ。ゾンビプログラマさんのツイート (Wed Apr 27 12:23:48 JST 2022 アクセス)
→curl
のURL展開のアイデアを拝借した。
max=$(curl -s https://t.co/qxtBramzEl | grep -Po '<div class="pagination pagination--top".+of\s+\K\d+(?!:.+$)')
— ゾンビプログラマ (@qeMkDrlaJwLLcQ) January 7, 2017
なんてしてもいいかも。
雑記
久しぶりに実行してみたら動かなかったので、リハビリも兼ねて動くように修正してみた。
→ 記事を書くこと自体が久しぶりだった…