LoginSignup
4
3

More than 5 years have passed since last update.

テキストファイルを対象に検索する。

Last updated at Posted at 2015-09-22

テキストファイルだけを対象に文字列を検索するbashの関数。
ソース・ファイル(拡張子がc, h, S)を対象に検索する関数を実装していたが(linux(カーネル)ソース解析:システムコール呼び出し)、ファイルの名前に依らず、テキストファイルを対象に検索する場合が結構あったので、こちらも作ってみた。

.bashrc
function stxt() {
        find . | perl -nl -e 'print if -f && -T' | xargs -I{} grep $1 {} /dev/null
}

perlのところが少し分かり難いので説明すると、
・eオプションで実行する1行のスクリプトを指定。
 (複数行指定したい場合はeオプションを繋げれば良いらしい)
・nオプションで、標準入力からの入力に対して、ループでeオプションで指定したスクリプトを実行。
 (while (<>) {}で括ったのと同じような感じで動く)
・lオプションで、標準入力からの読み込み内容から改行を取り除く。
 (改行コードがあると、if -f && -Tのところでファイル名が認識されない)

上記により、findコマンドが出力したファイル名のリストから、テキストファイルだけをperlで抜き出すように動くようになる。

上記のperlの内容を、スクリプト(whileを使った形)で書くと、次のように書ける。

tfil.pl
#!/usr/bin/perl

while (<>) {
        print if -f ($_ =~ s/[\n\r]//gr) && -T ($_ =~ s/[\n\r]//gr);
}

($_ =~ s/[\n\r]//gr)の部分は、非破壊置換。(rが非破壊の指定)

tfil.plの実行パスを通して、tfil.pl使うように、stxtを修正すると、次のようになる。

.bashrc
function stxt() {
        find . | tfil.pl | xargs -I{} grep $1 {} /dev/null
}

実際には上記のような修正はしないが、perl -nl -e 'print if -f && -T'が多少はイメージしやすくなるかと思って、ちょっと強引に実装してみました。

Cのソースを読んだりする時に、Makefileや、拡張子がc, h, S以外のファイルをincludeしている場合や、vimとかコマンドの環境を調べたりする時などに、テキストファイルを対象にした検索は役に立つ。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3