ディレクトリに多数のログ ファイルがあります。すべてのログ ファイルで文字列を検索し、ファイルの名前と文字列が見つかった行番号をエコーするスクリプトを作成しようとしています。
-lオプションはファイルの名前のみを返し、行番号については何も返さないため、おそらく2つのgrepを使用する必要があると思います-一方の出力を他方にパイプします。どうすればこれをうまく達成できるかについての洞察をいただければ幸いです。
どうもありがとう、
アレックス
$ grep -Hn root /etc/passwd
/etc/passwd:1:root:x:0:0:root:/root:/bin/bash
組み合わせて、あなたが期待することを-H
行います。-n
文字列なしで必要な情報をエコーする場合:
$ grep -Hn root /etc/passwd | cut -d: -f1,2
/etc/passwd:1
またはawkで:
$ awk -F: '/root/{print "file=" ARGV[1] "\nline=" NR}' /etc/passwd
file=/etc/passwd
line=1
shell
変数を作成する場合:
$ awk -F: '/root/{print "file=" ARGV[1] "\nline=" NR}' /etc/passwd | bash
$ echo $line
1
$ echo $file
/etc/passwd
を使用し-H
ます。を持たない grep を使用している場合は-H
、2 つのファイル名を指定します。例えば:
grep -n pattern file /dev/null
私のバージョンの grep は、一致する行からテキストを返し続けました。これは、後であるかどうかわかりませんでした...出力をawk
コマンドにパイプして、ファイル名と行番号のみを出力することもできます
grep -Hn "text" . | awk -F: '{print $1 ":" $2}'