ディレクトリを Grep し、行番号を含むリストを返します。

ディレクトリを Grep し、行番号を含むリストを返します。

私は現在、bashスクリプトとこれらすべての面白いものについてもっと学びようとしています。

find $path | xargs grep -n $pattern | awk '{print $1}'

これが動作している間に車輪を再発明しているのだろうか。ディレクトリを検索し、ファイル内のパターンを見つけ、行番号を含むリストを返すより良い方法はありますか?

ベストアンサー1

多くのgrepバリアントが再帰オプションを実装します。たとえば、GNU grep

-R, -r, --recursive
          Read all files under each directory, recursively; this is equivalent to the -d recurse option.

その後、以下を削除できますfind

grep -n -r $pattern $path | awk '{ print $1 }'

ただし、これは単純な行番号以上のものを保存します。awk最初の列を印刷します。この例

src/main/package/A.java:3:import java.util.Map;
src/main/package/A.java:5:import javax.security.auth.Subject;
src/main/package/A.java:6:import javax.security.auth.callback.CallbackHandler;

次のように印刷されます。

src/main/package/A.java:3:import
src/main/package/A.java:5:import
src/main/package/A.java:6:import

:import各行に注意してください。これを使用してsed出力をフィルタリングできます。

:ファイル名にaが表示される可能性があるため、-Zgrepオプションを使用してファイル名の後にnul文字(\ 0)を出力できます。

grep -rZn $pattern $path | sed -e "s/[[:cntrl:]]\([0-9][0-9]*\).*/:\1/" 

前と同じ例では

src/main/package/A.java:3
src/main/package/A.java:5
src/main/package/A.java:6

おすすめ記事