Проверьте, является ли условие 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"}' 
  • Найдите кучу gps-файлов в папке для окончательного расстояния, выведите список расстояний
  • Греп от конца файла до начала
  • Как заставить Vim вести себя как «tail -f»?
  • Каков самый простой способ выполнить текст из хвоста в командной строке?
  • Можно ли «перевернуть» символическую ссылку на новый файл, не затрагивая никаких открытых дескрипторов файлов?
  • Редактирование текстового файла с Vim не обновляет tail -f
  • Отрицательные аргументы для головы / хвоста
  • Окрашивание хвостового выхода с помощью perl
  • `tail -f` частично потребляет последнюю строку, не заботится о новых или nul
  • разделение CSV и сохранение заголовка без промежуточных файлов
  • Как выполнить эту команду оболочки из Python?
  • Linux и Unix - лучшая ОС в мире.