一致するgrepを呼び出すために構造化ファイルから読み取る

一致するgrepを呼び出すために構造化ファイルから読み取る

File:最初のファイルは記述子として識別され、残りのファイルは+文字で始まる別々の行にある構造化ファイル名のリストを含むログファイルを取得しました。

File:検出されると、一致するパターンを使用してファイル名を印刷するループが必要です。次に、+最初からファイル名を選択し続けます。空白行に達するか、別のフィールド名(たとえばPackage:)が表示されると、ファイルの読み取りが停止します。

cat /home/flora/logs/27043-T13:09:44.893003954.log
%rec: dyna

Ptrn: Gnu
File: /home/flora/dynamic.sh
+ /home/flora/comint.sh
+ /home/flora/linge/engine.sh
+ /home/flora/Opstk/playa.sh
+ /home/flora/bin/edv.sh
+ /home/flora/Opstk/bin/ling.rc
+ /home/flora/parade.rc
System: 64-Bit

read変数を使用してファイル全体のリストを保存するときにメモリ不足の問題を回避するには、簡単に始めてください。

while IFS= read -rd '' fl; do
  grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < "$logfl"

ptrn各ファイルに対して呼び出される検索パターンを定義します。

答え1

この質問へのコメントからrecutils、あなたはこのデータをGNUツールセットで読める形式に変換したと言いました。

次のツールを使用してパス名を抽出し、次のように呼び出しますgrep

recsel -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}

Fileこれにより、名前付きファイルのフィールドに関連した値が選択されて印刷されます$logfl。コマンドで生成された行ごとにrecselxargs呼び出して、デフォルトの正規表現grepに一致する行を抽出します$ptrn

質問ファイルの内容は次のとおりです。一つ改行を含む値。

別の値を持つ複数のフィールドを含むレコードファイルがある場合は、次のFileものを使用できます。

recsel -C -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}

答え2

プロセス置換を使用し(ファイル全体ではなく)、繰り返すファイル名を含む行のみを渡します。

while IFS= read -r fl; do
  grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < <(grep -o '/.*' "$logfl")

または、ファイル全体を処理し、キーワードが表示されるまで1行ずつスキップし、キーワードが消えるまでFile:文字列操作で1行ずつ処理してから読み取りを停止します。/${fl#*/}+

# some control flags
begin=
exit=continue

while IFS= read -r fl; do
  case ${fl%[[:blank:]]*} in
    *File:*)
      begin=start
    ;;
    *+*)
      exit=break
    ;;
    *)
      $exit
    ;;
  esac
  [ "$begin" ] && \
  grep --color -ni -C 8 -e "$ptrn" -- "/${fl#*/}"
done < "$logfl"

関連情報