grepを使用してrailsディレクトリを検索しようとしています。特定の単語を探しています。grepでファイル名と行番号を出力したいと思います。
これを行うgrepフラグはありますか?私はの組み合わせを使用しようとしている-n
とし-l
たが、これらはないか数字で、ファイル名をプリントアウトするか、単に簡単に読み取ることができない端末にテキストの多くをダンプしています。
例:
grep -ln "search" *
それをawkにパイプする必要がありますか?
回答:
-l
の出力を抑制するので、制限が強すぎると思います-n
。私は提案します-H
(--with-filename
):各一致のファイル名を出力します。
grep -Hn "search" *
出力が多すぎる場合は-o
、一致する部分のみを印刷してみてください。
grep -nHo "search" *
grep -rin searchstring * | cut -d: -f1-2
つまり、searchstring
大文字と小文字を区別せずに(この例では文字列を)再帰的に検索し、行番号を表示します。そのgrepからの出力は次のようになります。
/path/to/result/file.name:100: Line in file where 'searchstring' is found.
次に、コロン:
をフィールド区切り文字として使用し、フィールド1から2を表示して、その結果をcutコマンドにパイプします。
よく使用する行番号-f1
(ファイル名とパスのみ)が必要ない場合は、出力をuniq
にパイプして、各ファイル名が1回だけ表示されるようにします。
grep -ir searchstring * | cut -d: -f1 | uniq
私は使用するのが好きです:
grep -niro 'searchstring' <path>
しかし、それは私がいつも他の方法を忘れており、何らかの理由でロバート・デ・grep -
ニーロを忘れることができないからです:)
@ToreAurstadからのコメントはつづりが可能でgrep -Horn 'search' ./
、覚えやすくなっています。
grep -HEroine 'search' ./
動作する可能性もあります;)
好奇心旺盛な方へ:
$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
-E, --extended-regexp PATTERNS are extended regular expressions
-e, --regexp=PATTERNS use PATTERNS for matching
-i, --ignore-case ignore case distinctions
-n, --line-number print line number with output lines
-H, --with-filename print file name with output lines
-o, --only-matching show only nonempty parts of lines that match
-r, --recursive like --directories=recurse