grep結果を送信して検索

grep結果を送信して検索

異なるイベント間のいくつかのファイル名を含むログファイルがあるため、サブフォルダーにある必要があります。特定のフォルダとサブフォルダに存在する必要があるxmlファイル内のファイル名にも同じニーズが適用されます。ログファイルにgrepを使用し、正確なファイル名を抽出してクエリに提供する必要があるようです。 1行にファイル名のリストを簡単に取得できますが、findで作業することは正確には機能しません。インターネットはその逆の答えでいっぱいです。 grepと入力した結果を見つけます。

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' /home/myname/log/myspecificlogfile.log

このコマンドの結果をxargsにパイピングしてみましたが、実際には存在しないファイルと実際に存在するファイルの両方から結果が出ませんでした。 echo単純化するために、findパラメータ-lsはまだ追加されていません(しかし必要です)。

echo 12345.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'    #Nonexisting pdf
echo 67890.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'   #Existing pdf, no results

フォルダとサブフォルダ内のファイルを見つけるためにgrepの結果をどのようにパイプできますか?

答え1

私はそれをします:

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' \
  /home/myname/log/myspecificlogfile.log | awk -F / '
     ARGIND == 1 {files[$0]; next}
     $NF in files' - RS='\0' <(
     find /home/myname/workfolders/ -name '*pdf' -type f -print0)

grep(とのGNUの実装と、または同じawkプロセス置換をサポートするシェルを仮定)。kshzshbash

findたとえば、ファイル名や 'を使用することは適切ではありません-name。ファイル名ごとに1回実行するのは非効率的です。の呼び出しを使用するソリューションを作成しても、実行中のハッシュ検索よりも効率が悪くなる可能性があります。*.pdf?.pdffindfind-name a.pdf -o -name b.pdf...awk

答え2

使用される他の変形検索+グレブ

find /home/myname/workfolders/ \
     -name '*pdf' -type f -exec grep -qFf \
          <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)'\
                 /home/myname/log/myspecificlogfile.log) \
     -print

または、2つのコマンドにパイプすることもできます。

find /home/myname/workfolders/ -name '*pdf' -type f |
grep -qFf <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)' \
            /home/myname/log/myspecificlogfile.log)

関連情報