~/blog/performing-full-text-search-with-ag-in-bash
Published on

Bashで正規表現全文検索するならagが最強

2512文字5分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

Linuxパソコン・サーバーでのコマンドラインにおいて、Bashで正規表現全文検索するならagが最強だった、というお話になります。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_0f8b57fc-169b-4035-9a5e-07af053ef07a.png

Bashでファイルの正規表現検索をしたり、標準出力のパイプを正規表現したりするのにgrepを使ってはいませんか?fzfgrepも便利ですが、agはもっと便利です。

以前はbashで正規表現でテキスト検索というと、find . -type f | xargs grep "$1"なんてコマンドが使われていたりしましたが、agであればそんな手間はありません。

sudo apt-get install silversearcher-ag ggreer/the_silver_searcher: A code-searching tool similar to ack, but faster.

agの何がすごいか

  • すごい早い
  • PCRE正規表現なので肯定先読みなどが使える
  • 日本語も対応
  • 行が出力される。カラムも出力できる。 … --column
  • 検索文字のハイライトとか配慮が足りてる。もちろんquietな出力も可能。
  • 前後の行も出力できる … -C [int] (個人的にこれが一番気に入ってる)

僕の実際の使用例

(あんま参考にならないと思う)

僕は論理的にノートを取るのが大好きで、Markdownならぬ独自の記法をいくつか生み出したりしています。 そういう記法に従って書かれたテキストはどうやってパース、検索されるかといえば、正規表現なわけです。

僕のノートファイルは/mnt/c/google_drive/note//mnt/c/note/に分けています。基本的に前者。さらに、everything_note.mdtmp.mdtrash.mdなどとわかれています。ここらへんは別の記事で書いているかもしれません。

その上で、まず、それらのフォルダにあるテキストファイルを検索するコマンドの実装が以下。

agnote ()
{
    ARG2=${2:-0};
    ag -G "^.*\.(md|txt)$" -C ${ARG2} -S "${1}" /mnt/c/google_drive/note/ /mnt/c/note/
}

-G ... restrict file by match -C ... context; print before and after lines of each match -S ... smart case (default)

第二引数で前後の行の出力の行数を指定します。第一引数が検索する正規表現です。あとは見ての通りです。

で、応用例としての一例を紹介すると、以下。

note-getskd(){
  ag -G "^.*\.(md|txt)$" -C "3" -S "\s:(skd|schedule):($(date +%Y)\/)?($(date +%-m/%-d '--date=+0 day')|$(date +%-m/%-d '--date=+1 day')|$(date +%-m/%-d '--date=+2 day')|$(date +%-m/%-d '--date=+3 day')|$(date +%-m/%-d '--date=+4 day')|$(date +%-m/%-d '--date=+5 day')|$(date +%-m/%-d '--date=+6 day'))[?]?(T[0-9]{1,2}:[0-9]{1,2})?[?]?" /mnt/c/google_drive/note/ /mnt/c/note/
}

これがやっているのは、ノートファイルのなかのスケジュール関連のノートを検索、しています。

Markdownでいう#で区切られた一単位をノートやノートブロックと定義しており、例えば、以下の2つのノートがスケジュール関連のノートとなります。

# note::実技教習 :skd:5/22T13:00-

...

# note::返品集荷 :skd:3/15T13:00

...

:はタグと定義しており、現状で30個くらいあります。:skd:scheduleのエイリアスですね。:[key]:[value]または:[key]のハッシュ形式で、複数ある場合はスペース区切りになります。atomで正規表現検索する際にも活用できます。

note-getskdがやっているのは、今日の日付から7日以内のスケジュール関連ノートを出力する、というものです。若干メタプログラミング要素が入ってややこしくなっています。他にいい方法もあったかもしれない。

(googleカレンダー使えってそれ一。一元管理できるのが好きなんです。)

なんかagよりノートテイキングの概説のが長くなってしまった。完全な僕のノートのとり方については時間を見つけて連載及び書籍として公表したいと思っています。

avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?