Text-Processing

當日誌中出現某些文本時,跟踪日誌並執行命令的最佳方式

  • October 15, 2021

我有一個伺服器日誌,當伺服器啟動時,它會將特定的文本行輸出到其日誌文件中。我想在伺服器啟動後執行一個命令,因此執行以下操作:

tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?

做這個的最好方式是什麼?

一個簡單的方法是 awk。

tail -f /path/to/serverLog | awk '
                   /Printer is on fire!/ { system("shutdown -h now") }
                   /new USB high speed/  { system("echo \"New USB\" | mail admin") }'

是的,這兩個都是來自核心日誌的真實消息。使用 Perl 可能會更優雅一些,並且還可以替換對 tail 的需要。如果使用 perl,它看起來像這樣:

open(my $fd, "<", "/path/to/serverLog") or die "Can't open log";
while(1) {
   if(eof $fd) {
       sleep 1;
       $fd->clearerr;
       next;
   }
   my $line = <$fd>;
   chomp($line);
   if($line =~ /Printer is on fire!/) {
       system("shutdown -h now");
   } elsif($line =~ /new USB high speed/) {
       system("echo \"New USB\" | mail admin");
   }
}

引用自:https://unix.stackexchange.com/questions/12075