Linux

如何組合兩個命令來統計壓縮和未壓縮日誌文件中的數據?

  • November 1, 2015

我正在執行此命令以獲取來自伺服器的失敗登錄嘗試的計數,auth.log並且它執行良好:

sudo cat /var/log/auth.{log,log.1} | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c

但問題是——就像世界上的每台伺服器一樣——我有一些由日誌輪換創建的 GZipped 檔案,這些檔案不會被這個命令解析:

-rw-r----- 1 syslog adm  7822722 Oct 31 13:44 /var/log/auth.log
-rw-r----- 1 syslog adm 12532511 Oct 25 06:59 /var/log/auth.log.1
-rw-r----- 1 syslog adm  2250939 Oct 18 06:55 /var/log/auth.log.2.gz
-rw-r----- 1 syslog adm  2139669 Oct 11 07:06 /var/log/auth.log.3.gz
-rw-r----- 1 syslog adm  2769919 Oct  4 06:54 /var/log/auth.log.4.gz

為了處理這些問題,我使用了一個命令的變體來zcat代替,cat但是必須執行兩個命令來獲取這些數據有點麻煩。有沒有辦法將catandzcat命令組合成一個命令,這樣我就可以獲得組合結果?我知道我可以編寫一些 Bash 腳本來過濾壓縮文件和未壓縮文件,但是我在各種伺服器上使用這個目前的單線,我希望有一個我可以在需要時快速參考和使用的單線。

更多細節。

我一直在做一些安全審計和防火牆調整,並執行這個命令,它可以很好地記錄來自auth.logUbuntu Linux 機器上文件的“密碼失敗”嘗試:

sudo cat /var/log/auth.{log,log.1} | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c

效果很好!輸出看起來像這樣:

5909 Oct 18
13444 Oct 19
 351 Oct 20
 162 Oct 21
 499 Oct 22
 377 Oct 23
 145 Oct 24
10897 Oct 25
  76 Oct 26
  54 Oct 27
 310 Oct 28
1024 Oct 29
 208 Oct 30
  30 Oct 31

雖然這對於未壓縮的日誌很有效,但由於日誌會旋轉並被壓縮,所以總會有一些 GZip 壓縮文件也可以很好地統計。所以我執行上述命令的這個變體,它使用zcat

sudo zcat -q /var/log/auth.log* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c

輸出是這樣的:

gzip: /var/log/auth.log: not in gzip format

gzip: /var/log/auth.log.1: not in gzip format
 10413 Sep 27
 15977 Sep 28
 12297 Sep 29
 14438 Sep 30
 23394 Oct 1
 12912 Oct 2
 15844 Oct 3
 19697 Oct 4
 15350 Oct 5
 12358 Oct 6
 12692 Oct 7
  8377 Oct 8
 10875 Oct 9
   565 Oct 10
 16027 Oct 11
 10422 Oct 12
  6808 Oct 13
 26891 Oct 14
  9493 Oct 15
  5138 Oct 16
  9415 Oct 17
  2226 Oct 18

如您所見,輸出在工作時工作,但如果該命令的catzcat變體可以簡單地組合成一個命令,那就太好了。怎麼可能呢?

獎勵積分:

這些不是關鍵問題,但如果可以在解決方案中以某種方式解決它們會很好:

  • 請注意,在輸出的頂部,嘗試處理兩個未壓縮文件zcat時會出現兩個錯誤。zcat壓制那會很好。
  • 另請注意catzcat命令如何顯示 10 月 18 日的數據;日誌輪換發生的一天。有什麼方法可以在命令中將這兩個值相加嗎?如果沒有,我可以有兩行 10 月 18 日數據的不同值,我必須手動加起來。

如有必要,可以使用zgrepwhich 將解壓縮,因此適用於純文字和壓縮輸入。grep/zgrep 也可以直接處理多個文件,這在這種情況下是需要的,因為標準輸入的混合壓縮和文本並不總是按預期工作。-h使用或抑制 grep 輸出中的文件名--no-filename

sudo zgrep -h 'Failed password' /var/log/auth.* | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c

手冊頁:

ZGREP(1)                                                              ZGREP(1)

NAME
      zgrep - search possibly compressed files for a regular expression

SYNOPSIS
      zgrep [ grep_options ] [ -e ] pattern filename...

DESCRIPTION
      Zgrep  invokes grep on compressed or gzipped files.  All options specified
      are passed directly to grep.  If no file is specified, then  the  standard
      input  is  decompressed if necessary and fed to grep.  Otherwise the given
      files are uncompressed if necessary and fed to grep.

      If the GREP environment variable is set, zgrep uses it as the grep program
      to be invoked.

AUTHOR
      Charles Levert (charles@comm.polymtl.ca)

SEE ALSO
      grep(1), gzexe(1), gzip(1), zdiff(1), zforce(1), zmore(1), znew(1)

引用自:https://serverfault.com/questions/733097