現在、私は次のようにgrepを使用しています。
grep -lr <PATTERN> .
これにより、コンテンツ(名前ではない)に含まれるすべてのファイルのリストを含む次の出力が表示されます。
./path/to/file1
./path/to/file2
...
これは重要ではありませんが、行番号を知っておくと便利です。次の出力は理想的ですが、grepのマニュアルページを見た後、正しいスイッチが見つからないようです。
./path/to/file1 15, 22, 54
./path/to/file2 16, 17
...
grepや他のツールを使ってこれを達成できますか?
答え1
確認する同様の操作が基本的に行われます。あなたはそれを使用することができます
$ ack blah
path/to/blah
16: blah blah
19: blah blah blah
path/to/more/blah
21: blahness
一致するファイル名だけが必要な場合と言うと、各ファイルの一致数を知らせますack -l
。ack -lc
答え2
Grepはファイル名のみを印刷するか、ファイル名と一致する数、または一致する行(ファイル名と行番号を含めることができます)のみを印刷することを選択できますが、複数の一致を単一行に圧縮することはできません。
grep出力をフィルタリングしたり、awkなどの他のツールを使用したりできます。
find . -type f -exec awk 'FNR==1 {if (found) print ""; found=0}
/PATTERN/ { if (!found) printf("%s", FILENAME);
printf(" %d", FNR);
found=1 }
END {if (found) print ""}' {} +
答え3
grep -rins <pattern> *
これはあなたの要件を満たしていますか?
を使用する場合など、より複雑なパターンがある場合は、egrep
この機能を使用すると便利ですegrep -rinos <pattern> *
。
読みやすさをさらに向上させるには、--color
パラメータリストに追加してください。個人的に私.zshrc
:
export GREP_OPTIONS="--color"
答え4
grep
タグ-H
にはファイル名が含まれており、grep
-nタグは行番号を印刷します。最初の一致とファイル名のみを一覧表示するには、を使用できます-l
。
他の情報を除外するには、ファイルにパイプすることができるsed
行番号とファイル名をインポートしながらパイプすることができますsed
。