Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

テキストファイルだけを対象に文字列を検索する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とかコマンドの環境を調べたりする時などに、テキストファイルを対象にした検索は役に立つ。

kou_tana77
基盤系プログラムの開発。 プログラミング言語はC/C++が主。 好きな言語はperl。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away