Text-Processing

用於查找字元串並將輸出列印到螢幕的 Shell 腳本

  • October 21, 2022

我試圖讓尾隨日誌文件變得容易,並且僅將單個欄位的輸出列印到螢幕上。

我在 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上面的命令,就簡單多了。

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