Проверьте, является ли условие awk совпадением в лог-файле

Я хочу проверить файл auth.log для принятых sshd-соединений и выполнить действие, если они найдены.

Вот мой код:

tail -f /var/log/auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }' 

По какой-то причине это не приводит к выходу. Может кто-нибудь объяснить, почему?

2 Solutions collect form web for “Проверьте, является ли условие awk совпадением в лог-файле”

Я думаю, что ваша проблема связана с буферизацией tail -f :

 ~$ tail auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }' FOUND FOUND 

Он работает с tail , но не работает с tail -f :

 ~$ tail -f auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }' ^C 

Обходной путь, который вы можете использовать, использует цикл while для чтения каждой строки tail -f :

 ~$ tail -f auth.log | while read line > do > echo $line | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND")} }' > done FOUND FOUND 

Поиск man awk для buffer , я нашел параметр -W (но это версия mawk …):

-W interactive

    устанавливает небуферизованные записи в stdout и строковые буферизированные чтения из stdin. Записи из stdin являются линиями независимо от значения RS .

также:

mawk принимает аббревиатуры для любого из этих параметров, например, « -W i » и « -W i » …

 ~$ tail -f auth.log | awk -Wi '/sshd/ && /Accepted/ {system("echo FOUND")}' FOUND FOUND 

Вы также можете использовать вызов fflush() awk для fflush() вывода:

 tail -f /var/log/auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { fflush(); system("echo FOUND") } }' 

Тем не менее, ваш awk излишне сложный. Все что тебе нужно это:

 tail -f /var/log/auth.log | awk '/sshd/ && /Accepted/{ fflush(); print "FOUND"}' 
  • Как изменить цвет символа при хвосте и tr
  • Cygwin - хвост останавливает чтение входной трубы после первой записи
  • Каков самый простой способ выполнить текст из хвоста в командной строке?
  • Редактирование текстового файла с Vim не обновляет tail -f
  • Перенаправление вывода GREP в разные текстовые файлы в зависимости от содержимого захвата
  • Как я могу контролировать файл, который полностью воссоздается во время его запуска?
  • Выполнение хвоста -f в текстовом файле поверх sshfs не работает. Зачем?
  • Окрашивание хвостового выхода с помощью perl
  • Как активно grep log за последние 15 секунд для фразы?
  • Объединение tail && journalctl
  • Tail Grep - печать окружающих линий до тех пор, пока шаблон не будет сопоставлен
  • Linux и Unix - лучшая ОС в мире.