Нет stdlib в UNIX v7?

Ваше узкое место - чтение файла 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).

3
19.03.2016, 07:45
0 ответов

Теги

Похожие вопросы