一日中苦労しましたが、まだ成功していません。
このスクリプトがあります。
#!/bin/ksh
fname=$1
for batchname in $(grep -i "Processing batch" $fname | cut -d "'" -f2)
do
Batch_state=`grep -c -i "Batch '$batchname' was successful" $fname`
if [[ "$Batch_state" -ge 1 ]];then
{
S_Time=`awk '/[0-9]_[0-9].*successful/{getline;getline;getline;print}' $fname | awk '{print $2}'`
E_Time=`awk '/[0-9]_[0-9].*successful/{getline;getline;getline;getline;print}' $fname | awk '{print $2}'`
echo -e $batchname"\t"$S_Time"\t"$E_Time
}
else
{
echo $batchname encountered an error
}
fi
done
このコードによって生成された出力は次のとおりです。
02_1231324 14:29:04 15:29:11 14:32:19 15:33:11
79_3097935 14:29:04 15:29:11 14:32:19 15:33:11
希望の出力:
02_1231324 14:29:04 14:32:19
79_3097935 15:29:11 15:33:11
入力例:
2013/06/11 14:29:04 <0999> (725102)
Creating batch '02_1231324.0'...
2013/06/11 14:29:04 <0999> (725102)
Batch '02_1231324' was successful
2013/06/11 14:29:04 <0999> (725102)
TMR:Child ZERO, 160 Docs 320 Pgs 3874 KByts Tot 0.42 WAL 0.10 WALIO 0.15 IO 0.03 secs
2013/06/11 14:29:04 <0999> (725102) Processing batch '02_1231324'
2013/06/11 14:32:19 <0999> (725102)
Total in batch: 160 documents using 4 KBytes
2013/06/11 15:29:11 <0999> (725102)
Creating batch '79_3097935.0'...
2013/06/11 15:29:11 <0999> (725102)
Batch '79_3097935' was successful
2013/06/11 15:29:11 <0999> (725102)
TMR:Child ZERO, 160 Docs 320 Pgs 3874 KByts Tot 0.42 WAL 0.10 WALIO 0.15 IO 0.03 secs
2013/06/11 15:29:11 <0999> (725102) Processing batch '79_3097935'
2013/06/11 15:33:11 <0999> (725102)
Total in batch: 160 documents using 4 KBytes
TMR:Child ZERO, 160 Docs 320 Pgs 3874 KByts Tot 0.42 WAL 0.10 WALIO 0.15 IO 0.03 secs
2013/06/11 13:26:57 <0999> (725102) Processing batch '12_2013162201'
2013/06/11 13:26:57 <0999> (725102)
Total in batch: 160 documents using 4 KBytes
それでは、私のスクリプトに何が問題なのでしょうか?希望の出力をどのように取得できますか?
ベストアンサー1
ログを解析するには、次のものが必要な場合があります。
#!/bin/awk -f
{
if (/was successful/) {
bn = $2;
gsub(/'/, "", bn);
succ[bn] = 1;
}
if (/Processing batch/) {
bn = $7;
gsub(/'/, "", bn);
if (bn in succ) {
succ[bn,",s"] = $2;
getline
succ[bn,",e"] = $2;
} else
fail[bn] = 1;
}
}
END {
for (val in succ)
if (val !~ /,/)
print val " " succ[val,",s"] " " succ[val,",e"];
for (val in fail)
print val " encountered an error";
}
オリジナルスクリプト少し単に減少1awk
入力データの構造に関するいくつかの厳しい仮定の下で呼び出されます。
#!/bin/ksh
fname=$1
for batchname in $(grep -i "Processing batch" $fname | cut -d "'" -f2); do
Batch_state=`grep -c -i "Batch '$batchname' was successful" $fname`
if [[ "$Batch_state" -ge 1 ]]; then
awk -v b=$batchname '
{
if ($0 ~ "Processing.*" b) {
s = $2;
getline;
e = $2;
print b " " s " " e;
exit
}
}' $fname
else
echo $batchname encountered an error
fi
done
grep -A
(使用の短いバージョンは、一致する行-A
を選択するGNU拡張です。そして従うべき行数(デフォルトは1):
#!/bin/ksh
fname=$1
for batchname in $(grep -i "Processing batch" $fname | cut -d "'" -f2); do
Batch_state=`grep -c -i "Batch '$batchname' was successful" $fname`
printf "%s" $batchname
if [[ "$Batch_state" -ge 1 ]]; then
grep -A1 "Processing batch '$batchname'" $fname | cut -f2 -d" " | fmt
else
printf "encountered an error\n"
fi
done
しかし、まだファイルを処理しています。3回。これを行う方法については、ChuckCottrillの回答を参照してください。
1イット〜らしいバッチは並列に処理されません。実際に望むのは、対応する行とProcessing batch
その後の行を含めることです。