Сохранить последнюю строку существующего целевого файла. А затем проанализируйте файл системного журнала в обратном порядке с помощью awk
и некоторой помощи из tac
:
p=$(tail -n1 output)
tac syslog | awk -v p="$p" '$0 == p{exit} /myentry/' | tac >> output
Когда будет найдена последняя строка (назад ), awk
выход. Если он не найден или вывод изначально был пустым, будет проанализирован весь файл (. Я предполагаю, что в системном журнале нет пустых строк для случая изначально пустого вывода ). Кроме того, таким образом мы ищем минимально необходимые строки, поэтому ожидается, что он будет хорошо работать с большими файлами.
Также держите в своем наборе инструментов эту простую эффективную команду:
awk '!seen[$0]++' output > output.tmp && mv output.tmp output
, который вы можете запустить в любое время, чтобы исправить целевой файл, сохраняя порядок, если по какой-либо причине туда удалось попасть дубликаты.
Вот простой подход:
$ awk 'NR==FNR{a[$0]++; next}/myentry/ && !a[$0]' myentries syslog
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete
Это выбирает новую совпадающую строку, поэтому все, что вам нужно сделать, это перенаправить на исходный файл:
awk 'NR==FNR{a[$0]++; next}/myentry/ && !a[$0]' myentries syslog >> myentries