Linux
如何組合兩個命令來統計壓縮和未壓縮日誌文件中的數據?
我正在執行此命令以獲取來自伺服器的失敗登錄嘗試的計數,
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
但是必須執行兩個命令來獲取這些數據有點麻煩。有沒有辦法將cat
andzcat
命令組合成一個命令,這樣我就可以獲得組合結果?我知道我可以編寫一些 Bash 腳本來過濾壓縮文件和未壓縮文件,但是我在各種伺服器上使用這個目前的單線,我希望有一個我可以在需要時快速參考和使用的單線。更多細節。
我一直在做一些安全審計和防火牆調整,並執行這個命令,它可以很好地記錄來自
auth.log
Ubuntu 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
如您所見,輸出在工作時工作,但如果該命令的
cat
和zcat
變體可以簡單地組合成一個命令,那就太好了。怎麼可能呢?獎勵積分:
這些不是關鍵問題,但如果可以在解決方案中以某種方式解決它們會很好:
- 請注意,在輸出的頂部,嘗試處理兩個未壓縮文件
zcat
時會出現兩個錯誤。zcat
壓制那會很好。- 另請注意
cat
和zcat
命令如何顯示 10 月 18 日的數據;日誌輪換發生的一天。有什麼方法可以在命令中將這兩個值相加嗎?如果沒有,我可以有兩行 10 月 18 日數據的不同值,我必須手動加起來。
如有必要,可以使用
zgrep
which 將解壓縮,因此適用於純文字和壓縮輸入。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)