【影響調査】プログラムの改修や仕様変更に伴う影響調査などで、威力を発揮するコマンド

ykarinoegrep, find, xargs, コマンド, 影響調査

はじめまして、インフラチームのykarinoと申します。
1月に入社してから間もないので、フリーエンジニアとして客先常駐していたころに
使用していた小技を紹介しようと思います。

プログラムの改修や仕様変更に伴う影響調査などで、調査対象ファイルが1万個など
極端に多い時に威力を発揮するコマンドです。

実用的な例として、設定ファイルの内容やプログラムの固定値などを書き換える際に、
該当ファイルを探すときなどに使えます。

#1)「パターンに一致した行のファイル内での行番号」とその「ファイル名」をテキストファイルに出力する。
$ find 【検索開始ディレクトリ】 -name '*' -type f -print | env LC_ALL=C xargs egrep -in '【検索条件】' > ./list.txt

#2)「パターンに一致した行を含むファイル名だけ」をテキストファイルに出力する。
$ find 【検索開始ディレクトリ】 -name '*' -type f -print | env LC_ALL=C xargs egrep -il '【検索条件】' > ./list.txt

※xargsにファイル名に日本語が含まれるものを入力するとエラーが発生するため、
「env LC_ALL=C」を指定してファイル名に日本語を含まれるデータを無視しています。

※#1)のegrepを実行した際に、Solarisなどの一部の環境上だと、egrepの表示される内容の末尾に
改行(LF)がないと前後の内容が一つの行になってしまいます。

↓クリックすると拡大して表示されます。

Solarisなどの一部の環境上で行う場合は少し面倒ですが、
以下のダミーファイルを仕込む方法で回避することができます。

#ファイル名のリストを作成する。
$ find 【検索開始ディレクトリ】 -name '*' -type f -print > ./list.dummy.1.txt

#ダミーファイル作成
$ echo '' > ./test.txt
$ echo './test.txt' >> ./test.txt
$ echo '' >> ./test.txt

#リストファイルにダミーファイルの保存場所を仕込む。
$ cat ./list.dummy.1.txt | perl -e 'while(<>){print $_;print"./test.txt\n";}' >
./list.dummy.2.txt

#「パターンに一致した行のファイル内での行番号」とその「ファイル名」をテキストファイルに出力する。
$ cat list.dummy.2.txt | env LC_ALL=C xargs egrep -in '【検索条件】|test\.txt' > ./list.dummy.3.txt
#ダミー部分を削除する。
$ cat ./list.dummy.3.txt | perl -pe 's/^\.\/test\.txt\:2\:\.\/test\.txt$//g;s/^\n$//g;' > ./list.txt
#ダミーファイルを削除する。
$ rm -i ./test.txt
#不要なファイルを削除する。
$ rm -i ./list.dummy.1.txt
$ rm -i ./list.dummy.2.txt
$ rm -i ./list.dummy.3.txt

最近、個人的にプログラム/サーバ/ネットワーク/DBなどの技術以外にも、
経営やビジネス、経理、心理学など、興味があるものが年々増えてきています。
ある意味、自分は本当の意味でのジェネラリスト志向かもしれません。

余談ですが、正規表現を見れば見るほど顔文字に見えてしまうのは、気のせいでしょうか。

ykarinoegrep, find, xargs, コマンド, 影響調査

Posted by ykarino