動かざることバグの如し

近づきたいよ 君の理想に

URLをパースするLinuxコマンド「trurl」

環境

  • trurl version 0.16.1

やりたいこと

ログ調査でFQDNで集計する必要があった。RubyPythonならパースするためのメソッドがあるがLinuxのコマンドで処理しようとすると難しい。

sedawkなどで頑張ってもいいが限界がある。と思っていたらcurlの作者がパースするコマンドを作ってくれていた。神

github.com

インストール

Ubuntuの場合は前もって apt install libcurl4-openssl-dev が必要。

git clone https://github.com/curl/trurl.git
cd trurl
make
sudo make install

ないとビルドエラーになる。

❯ make
cc $(curl-config --cflags) -W -Wall -Wshadow -pedantic -Wconversion -Wmissing-prototypes -Wwrite-strings -Wsign-compare -Wno-sign-conversion -Werror -g   -c -o trurl.o trurl.c
/bin/sh: 1: curl-config: not found
trurl.c:29:10: fatal error: curl/curl.h: そのようなファイルやディレクトリはありません
   29 | #include <curl/curl.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make: *** [<ビルトイン>: trurl.o] エラー 1

デフォルトでは/usr/local/bin/trurlにインストールされる。

❯ which trurl
/usr/local/bin/trurl
❯ trurl --version
trurl version 0.16.1 libcurl/8.5.0 [built-with 8.5.0]
features: imap-options normalize-ipv4 punycode punycode2idn url-strerror white-space zone-id

使い方

元のURLのホスト名(curl.se)をexample.comに置き換える

$ trurl --url https://curl.se --set host=example.com
https://example.com/

ポート番号を8080に指定する

$ trurl --url https://curl.se/we/are.html --set port=8080
https://curl.se:8080/we/are.html

何もない状態から、指定した要素で新しいURLを作り出すこともできる

$ trurl --set host=example.com --set scheme=ftp
ftp://example.com/

URLの末尾に新しいパスを追加する

$ trurl --url https://curl.se/hello --append path=you
https://curl.se/hello/you

すでにクエリがあるURLに、新しいパラメータ(search=string)を追加する

$ trurl --url "https://curl.se?name=hello" --append query=search=string
https://curl.se/?name=hello&search=string

ラッキングコードなど、特定のパターンに一致するクエリパラメータを削除する

$ trurl "https://curl.se?search=hey&utm_source=tracker" --qtrim "utm_*"
https://curl.se/?search=hey

URLからパスの部分(/we/are.html)だけを抜き出す

$ trurl --url https://curl.se/we/are.html --get '{path}'
/we/are.html

URLを各要素に分解して、JSON形式で表示させる

❯ trurl "https://fake.host/search?q=answers#frag" --json  
[
  {
    "url": "https://fake.host/search?q=answers#frag",
    "parts": {
      "scheme": "https",
      "host": "fake.host",
      "path": "/search",
      "query": "q=answers",
      "fragment": "frag"
    },
    "params": [
      {
        "key": "q",
        "value": "answers"
      }
    ]
  }
]

ログファイルなどから一括処理するには --url-file を使う。

❯ cat /tmp/urls.txt | trurl --url-file - -g '{host} {path}'   
www.google.com /
example.com /users/profile
www.google.com /search
chatgpt.com /share/e4f5g6h7
www.google.com /search

あとの細かい仕様は公式ドキュメントを読もう

参考リンク