プログラミング

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です