とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

interactiveにgrepしたい

鍛え抜かれたコマンドーの皆さんならgrepコマンドを使わない日はないでしょう。私も文字列の絞り込みによく使っています。

決まった文字列で絞り込む場合はgrepで十分だと思いますが、絞り込む文字列を探している段階ではgrepの結果を見ながらcat | grep cat | grep cat | grep ... とひたすらに繰り返すことになります。これがちょっと面倒で。

そんな時に使えるのがsigというツールです。

sig

github.com

コマンドの実行結果をインタラクティブに正規表現で絞り込みます。

使い方は簡単で、通常のgrepのように標準入力からデータを受け取るストリーミングモードと、最新のN行数分を読み込んでクエリを実行するアーカイブモードがあります。

アーカイブモード

アーカイブモードはsigコマンドに-aオプションを指定します。標準入力から受け取ったデータをバッファ(デフォルト1000行)に読み込み、そこから検索を行います。バッファリングのサイズは-qオプションで指定できます。

実際の動作はこちら

1つ注意が必要なのは、バッファリングの動作がリングバッファなところです。リングバッファはバッファサイズを超えた場合、最新の1件を読み込むと最古の1件を削除します。つまり、デフォルトだと最新の1000件しか保持しないので、数千行にわたるログファイルをsigに食わせても最新の1000件からしか検索できません。長いログを検索するにはストリーミングモードを使うのがいいでしょう。もしくは-q 10000などしてバッファサイズを変更してもいいかもしれません。ただし、ここの値を増やせばそれに比例してメモリ使用量も増えていきます。

ストリーミングモード

ストリーミングモードは標準入力から断続的にデータを受け取ってsigでフィルタリングするモードです。こちらが通常の動作です。

$ stern -n test . |& sig

この例ではsternの実行結果をsigに食わせて、sigでインタラクティブに検索します。|&はsternの標準出力、標準エラー出力両方をsigにパイプするという意味です。stern 2>&1 | sigと同じ意味

実際に動いて画面はこちら

ストリーミングモードで標準入力から大量のデータを渡されるとI/OのせいでCPU負荷が高まります。そんな時は--render-interval <milliseconds>を指定しましょう。画面の更新頻度が抑えられてCPU負荷を下げられます。

標準入力からではなく、sigコマンドのオプションで、実行コマンドを指定することもできます。

$ sig --cmd 'stern -n test .'

このように実行してもログの見え方は特にかわりはありません。--cmdに指定したコマンドはsig実行時とCtrl+Rを押した時に再実行されます。時々再読み込みしたい場合にいいかもしれません。

ストリーミング中Ctrl+Fを押すとアーカイブモードに切り替わります。目的のログを捕捉したらアーカイブモードで周辺ログを検索、なんて使い方が便利そうですね。Ctrl+Rで再度ストリーミングモードに戻ります。

まとめ

インタラクティブにgrepできるのがこのツールの強みですが、個人的にはストリーミングモードからアーカイブモードに行ったり来たりできるのがよさそうだと思いました。ストリーミングモード監視をしつつ、何かよからぬ文字列を見かけたらアーカイブモードで調査という感じで使えそうです。

詳細が気になる方は公式リポジトリのREADME.mdを読んでみてください。