BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【grep】覚えて楽する!特定の文字列を含むファイルを再帰的に洗い出そう

f:id:bftnagoya:20210305174608j:plain

はじめに

こんにちは!
先日とある神社で咲き誇る梅と、その蜜をせっせと集めるメジロたちを見ていつの間にか春が来たんだなーと実感した、BFT名古屋支店・インフラ女子(?)のやまぐちです。

今回は私がよく使うコマンドをサクッとご紹介です。

テキストの中を文字列を全検索する

コマンド:grep <文字列> -rl <パス>

例えば/etc 以下にある全ファイルの中で "Port" という文字列を含むファイルを洗い出したい時は以下のように実行します。

root@DESKTOP-AC9R8UJ:~# grep Port -rl /etc
/etc/services
/etc/cloud/templates/ntp.conf.sles.tmpl
/etc/cloud/templates/ntp.conf.opensuse.tmpl
/etc/X11/app-defaults/Editres-color
/etc/X11/app-defaults/Viewres-color
/etc/X11/app-defaults/Viewres
/etc/apache2/magic
/etc/apache2/mods-available/mime.conf
/etc/profile.d/cedilla-portuguese.sh
/etc/ssh/sshd_config
/etc/ssh/ssh_config

"Port" という単語をそれぞれのファイルで検索すると確かに含まれていることが分かります。

root@DESKTOP-AC9R8UJ:~# grep Port /etc/ssh/sshd_config
#Port 22
#GatewayPorts no

もちろん検索パターンを指定することもできます。 先ほどの検索を "Port" と "port" の両方で探したい場合は以下のようにします。

root@DESKTOP-AC9R8UJ:~# grep -e "[p|P]ort" -rl /etc
/etc/services
/etc/protocols
/etc/rsyslog.conf
/etc/ltrace.conf
~以下略~

使いどころ

個人的にはよく使うので何でもと言いたいところですが、例えば以下の時に役立っています。

  • その変数がAnsibleのどの処理で使われているか調べる
    • Playbookを読み解く時、この変数を変更した場合の影響範囲を調べるのに便利
  • ログファイルがたくさんある時にエラーの文言からそのエラーが出力されているログファイルを洗い出す
  • イメージをコピーして作成したサーバで元の設定(ホスト名、IPアドレスなど)が残っていないか確認する
    • 想定外のところに情報が残っていてセキュリティの問題が発生することを防ぐ
  • どこに設定が書かれているのか調べる
    • 例えばWebサーバの設定がhttpd.confに書かれているのか、それともconf.d以下のファイルに記載されているのかがファイルの中身を見なくてもわかる

終わりに

以上、今回はサクッと「特定の文字列を含むファイルを探す方法」を記載しました。このコマンドは短いので覚えちゃった方が早いです。findコマンドでやる方法もありますがコマンドが長いし検索に時間もかかるのでぜひこちらのコマンドを使ってみてください!