2022年4月27日

オライリー本の表紙に描かれている全動物をシェル芸でリスト化してみる(修正版)

以前に、 オライリー本の表紙に描かれている全動物をシェル芸でリスト化してみるという記事を作成しました。
しかし、元サイトの構成変更などにより、上記記事のコードが動作しない状態になっていました。
そこで今回、最新サイトに合わせて動作するように、また処理内容を(多少)分かりやすくするために、コードを書き直しました。

本記事では、オライリー社の「アニマルシリーズ」の表紙に描かれている全動物を、ワンライナーでリスト化する方法を記します。



実行環境

  • 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 で対象ページの内容を取得し、その後 grepcut で末尾の値を切り出していきます。

末尾値を取得できたら、 sed を使って文字列に埋め込み、目的の curl コマンドを生成しています。


参照Webサイト


雑記

  • 久しぶりに実行してみたら動かなかったので、リハビリも兼ねて動くように修正してみた。
    → 記事を書くこと自体が久しぶりだった…​

Tags: シェル芸 Unix
このエントリーをはてなブックマークに追加