Text-Processing
用於查找字元串並將輸出列印到螢幕的 Shell 腳本
我試圖讓尾隨日誌文件變得容易,並且僅將單個欄位的輸出列印到螢幕上。
我在 Linux 機器上有如下所示的日誌文件:
2022-10-21 16:00:08;areq_in=0;areq_qavg=0;areq_qmax=0;areq_sent=0;ares_out=0;ares_out_err=0;ares_out_ok=0;ares_qavg=0;ares_qmax=0;ares _recv=0;ares_tavg=0;ares_tmax=0;creq_out=0;creq_qavg=0;creq_qmax=0;creq_recv=0;cres_in=0;cres_qavg=0;cres_qmax=0;cres_sent=0;lic_rej=0 ;lic_use=0;mbr_from=0;mbr_to=0;mreject=0;mreject_conn=0;msys_recv=0;msys_sent=0;
日誌中的每一行都由 -
;
分隔的欄位組成,其中大部分是“key=value”形式。所以我想做的只是列印
creq_recv
螢幕上“鍵”名稱的欄位。我從某人的修復中獲取了這個腳本,但我認為我遺漏了一些東西。
#!/bin/bash creq_recv=$1 my_variable=`tail -f stats_2022102116.log | awk -F: -v creq_recv="$1" '$1 == creq_recv {$1=$1; print}' stats_2022102116.log` echo "$my_variable"
因為輸出為空
[root@priti ]$ ./chk_conn_log.sh [root@priti ]$
無論值是什麼,輸出都應列印在螢幕上
creq_recv
。例如,如下所示creq_recv=12 creq_recv=34 creq_recv=65
您可以使用僅列印該行的匹配部分和/或分別用於 PCRE 或擴展正則表達式
grep
的選項來做您想做的事情,這讓我們可以使用“一個或多個非;字元”:-o``-P``-E``[^;]+
tail -f stats_2022102116.log | grep -oP '(?=^|;)creq_recv=[^;]+'
或者,如果我們可以有其他以 結尾的欄位名稱,則更安全
creq_recv
:tail -f stats_2022102116.log | grep -oP '(^|;)\Kcreq_recv=[^;]+'
您
awk
失敗了,因為-v creq_recv="$1"
意味著“將 awk 變數creq_recv
的值設置為傳遞給腳本的第一個參數的值”。但是由於您正在啟動不帶參數 (./chk_conn_log.sh
)的腳本,所以它$1
是空的,所以creq_recv
也是空的。無論如何,即使設置了變數,那也行不通。既是因為
awk
腳本錯誤,又因為tail -f
除非你停止它,否則永遠不會退出,所以echo
不會執行。你想要這樣的東西:#!/bin/bash tail -f stats_2022102116.log | awk -F';' '{ for(i=1; i<=NF; i++){ if ($i ~ /^creq_recv=/) { print $i}}}'
不
echo
,只有tail
更正的 awk 腳本。但是只要使用grep
上面的命令,就簡單多了。