Você provavelmente quer algo assim para analisar seu log:
#!/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";
}
Seu script original ligeiramente reduzido para apenas 1 awk
chamar sob algumas suposições 1 estritas sobre a estrutura de seus dados de entrada).
#!/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
Versão mais curta usando grep -A
( -A
é uma extensão GNU que seleciona a linha correspondente e um número - 1 por padrão - das linhas seguintes):
#!/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
Mas estes ainda estão processando o arquivo 3 vezes . Veja a resposta de ChuckCottrill sobre como isso pode ser feito.
1 parece que os lotes não são processados em paralelo, e o que você quer é na verdade a linha contendo Processing batch
e a linha depois disso.