Ваше узкое место - чтение файла recon.txt
построчно в оболочке. Чтобы получить неудачные строки, вы можете предварительно обработать строки в логах, чтобы они выглядели как строки в recon.txt
, затем использовать comm(1)
для нахождения разности множеств, возможно, следующим образом:
comm -23 \
<(sort -u recon.txt) \
<(sed 's/.*| id=\([0-9]*\)| version=\([0-9]*\)|.*/\1,\2/' worker-6715.log.2016-$1.log.* | \
sort -u)
Это предполагает наличие оболочки, которая может обрабатывать конструкции <(...)
. Также обратите внимание, что строки в результате не сохраняют порядок строк в recon.txt
. Сохранить этот порядок было бы намного сложнее (и медленнее).
Если вам также нужны подсчеты успехов, вы можете сделать это наоборот, предварительно обработать recon.txt
так, чтобы он был похож на то, что можно найти в журналах, а затем использовать fgrep(1)
или grep -F
для поиска. Установка локалей на C
также может значительно ускорить работу на некоторых системах. Таким образом:
COUNT=$( \
sed 's/\([0-9]*\),\([0-9]*\)/| id=\1| version=\2|/' recon.txt | \
LC_ALL=C fgrep -f - worker-6715.log.2016-$1.log.* | \
wc -l )
Это предполагает, что recon.txt
не содержит дубликатов, и что каждая строка в recon.txt
совпадает не более одного раза во всех журналах. Снять первое ограничение будет сложно. Второе можно снять с помощью тщательно подобранного comm(1)
.