труба в Perl скрипт - PullRequest
       29

труба в Perl скрипт

1 голос
/ 04 февраля 2012

Мне нужно передать некоторые записи журнала в Perl-скрипт, но я не могу заставить его работать, используя ARGV или STDIN.

tail -f messages | grep --line-buffered "auth failure:" | awk '{print $1,$2,$3,$10}' | test3.pl

Возможно, что-то буферизуется, но кажется, что ничто не делает его в test3.pl, но если я пропущу | test3.pl, тогда я увижу, что должно войти в perl:

Feb 3 16:09:36 [user=someusername]  

Ответы [ 3 ]

5 голосов
/ 04 февраля 2012

awk будет буферизовать вывод по умолчанию, если он не подключен к терминалу.Звоните fflush() или system("") в вашем awk сценарии.

3 голосов
/ 04 февраля 2012

Похоже, что awk не выполняет буферизацию или линейную буферизацию при подключении к терминалу и выполняет блочную буферизацию при подключении к чему-либо, кроме терминала. Это довольно стандартное поведение, и именно поэтому вы должны передать --line-buffered на grep.

Вам нужно найти способ отключить буферизацию awk. Я не знаю, как это сделать, но я могу предоставить альтернативу Perl.

tail -f messages \
   | perl -lne'BEGIN{$|=1} /auth failure:/ && print join " ", (split)[0,1,2,9]' \
      | test3.pl

См. Также: Файл :: Хвост .

2 голосов
/ 04 февраля 2012

Ввод от трубы будет в вашем STDIN . Что заставляет вас думать, что его там нет? Вы можете прочитать это, используя

while (<>) {
  print;
}

Кроме того, вы можете выполнить все эти шаги в одной простой программе на Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...