Вы можете получить удовлетворительные результаты из этого (при условии, что ни одно из ваших имен файлов не содержит двоеточий):
grep -C 5 --recursive 'ERROR' log/* | sort --field-separator=: --key=2
Каждой строке будет предшествовать имя файла.Ваш вывод будет выглядеть примерно так:
logfile2:2010/07/21 13:28:52 INFO xxx
logfile2:2010/07/21 13:31:25 INFO xxx
logfile2:2010/07/21 13:31:25 DEBUG xxx
logfile3:2010/07/21 15:28:52 INFO xxx
logfile3:2010/07/21 15:31:25 INFO xxx
logfile3:2010/07/21 15:31:25 DEBUG xxx
etc.
Вы можете использовать AWK, чтобы переформатировать его в формат, который вы показываете в своем примере:
grep -C 5 --recursive 'ERROR' log/* | sort --field-separator=: --key=2 |
awk '{colon = match($0,":"); file = substr($0,1,colon - 1);
if (file != prevfile) {print "\n" file; prevfile = file};
print substr($0,colon+1)}'
Вот несколько улучшений в вашем скрипте, если вы все еще используете его:
find log/ -iname "*debug*.log" -size +0 | while read -r file
do
if grep -qsm 1 'ERROR' "$file"
then
echo -e "\n$file"
grep 'ERROR' --color=auto -C 5 "$file"
fi
done