次のgrep
コマンドは、文字列を含むファイルを返しますptrn
。このsed
コマンドはstp
。
grep -rl "${isufx[@]}" -e "$ptrn" -- "${fdir[@]}" |
sed "${sta}~${stp}!d" >> $logfl
これが結果になります
cat /home/flora/logs/27043-T13:09:44.893003954.log
file1.sh
file2.sh
file3.sh
file4.sh
file5.sh
file6.sh
次のような結果を得たい
cat /home/flora/logs/27043-T13:09:44.893003954.log
File: file1.sh
+ file2.sh
+ file3.sh
+ file4.sh
+ file5.sh
+ file6.sh
しかし、人々はそうすることはできないと思いますgrep
。一部はawk
ファイルに使用することを提案するかもしれませんlogfl
。
答え1
GNU rettools(あなたが言及したもの)を使うコメントからあなたのもう一つの質問):
: >output
recins -f File -v "$(cat logfile)" output
これにより、名前付きファイルが作成または消去され、値がファイルの内容である名前付きoutput
フィールドが挿入されます。File
logfile
GNU Recfile形式では、+
これらの文字は改行文字として扱われるため、上記の操作は挿入されます。単一値、改行文字が含まれています。
各ファイル名を別々の要素として挿入するには、次のようにします。
: >output
xargs -I {} recins -f File -v {} output <logfile
上記のコードはrecins
行ごとに1回呼び出され、各行logfile
に別々のキーと値のペアを挿入します。
入力をCSVファイルのままにすると、これをより効率的に実行できます。
{ echo File; cat logfile; } | csv2rec >output
echo
このコマンドは、ここで入力データの前にCSVヘッダーを追加するために使用されますcsv2rec
。
答え2
私はこうして問題を解決した。
grep -rl "${isufx[@]}" -e "$ptrn" -- "${fdir[@]}" |
sed '1s/^/File: /;1!s/^/+ /' >> $logfl