2012年12月22日土曜日

findとgrepコマンドを組み合わせて全文検索


複数ファイルの中身をまとめて検索するコマンドの組み合わせです。findコマンドの
結果をxargsを利用してgrepコマンドに渡し、キーワードとマッチしたファイルおよび
該当行を出力させることが可能です。

情報が古くなった等でWebページを削除する場合、そのページにリンクしている他の
ページを探し出してリンク切れを防止したい時にも使えそうです。

OS: CentOS 6.3(64-bit)
find: 4.4.2
grep: 2.6.3


■サンプルデータを準備

検索対象のHTMLファイル数を確認
[root@cent63 sample_data]# find . -type f | grep .html$ | wc -l 1127

■適当なキーワードで全文検索

キーワード「charset」にマッチしたしたファイル名と、その行数を出力
grepの「-n」オプションで該当行を出力させることができます。
[root@cent63 sample_data]# find . -type f | grep .html$ | xargs grep -n "charset" ./planning/file07_01_01_00095.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ./planning/keikan01_001032.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ./planning/index10_14.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ./planning/file08_02_00033.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ./planning/file07_00001.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ./planning/gikai01_001013.html:5:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> (以下省略)

もちろん日本語でも検索可能(対象のcharsetがUTF-8であれば)
[root@cent63 sample_data]# time find . -type f | grep .html$ | xargs grep -n "まちづくり" | wc -l 1810 real 0m0.093s user 0m0.052s sys 0m0.039s [root@cent63 sample_data]#
検索対象が1000ファイルくらいあっても1秒以下で検索可能でした。

■他のファイルからリンクされているかを調査

とりあえず対象ファイル数を調べた後、そのリストを表示させる。
[root@cent63 sample_data]# find . -type f | grep .html$ | xargs grep file08_00023.html | wc -l 6 [root@cent63 sample_data]# find . -type f | grep .html$ | xargs grep -l file08_00023.html ./planning/file08_00023.html ./planning/index08.html ./planning/index.html ./planning/file08_00015.html [root@cent63 sample_data]#

リンク切れ修正対象個所を表示
[root@cent63 sample_data]# find . -type f | grep .html$ | xargs grep -n file08_00023.html ./planning/file08_00023.html:84:<p><a href="/index.html">緑区ホーム</a> > <a href="/planning/index.html">区政情報</a> > <a href="/planning/index08.html">緑区議会</a> > <a href="/planning/file08_00023.html">インターネット中継</a> > 区議会のインターネット中継について</p> ./planning/file08_00023.html:243: <input name="email" type="hidden"> <input name="code" type="hidden" value="110100"> <input name="pgid" type="hidden" value="000005064"> ./planning/index08.html:132:<li class="arrow"><a href="/planning/file08_00023.html">予算特別委員会(7月11日)の録画中継を公開しました</a>[2012年7月19日]</li> ./planning/index08.html:142:<li class="parent"><a href="/planning/file08_05_00016.html">区議会からのお知らせ</a></li><li class="parent"><a href="/planning/index08_07.html">議会日程</a></li><li class="parent"><a href="/planning/file08_00023.html">インターネット中継</a></li><li class="child clearfix"> ./planning/index.html:153:<dl><dt class="dir1"><a href="/planning/file08_00023.html">インターネット中継</a></dt></dl> ./planning/file08_00015.html:134:<li class="arrow"><a href="/planning/file08_00023.html">インターネット中継</a><p>本会議と予算・決算特別委員会は、インターネット中継(生中継・録画中継)をしています。</p></li> [root@cent63 sample_data]#
※表示の都合上タグを"<"と">"で記載。

以上です。何かのお役にたてれば幸いです。

0 件のコメント:

コメントを投稿