Bash
如何在有或沒有空間的情況下獲得價值?
我有一個 bash 腳本,其中包含一組數據庫名稱,連接到每個數據庫名稱並在它們上執行儲存過程。我需要從儲存過程的輸出中獲取值並在腳本的其餘部分使用它們。許多輸出是這樣的:
CONDBAT= 10000 MDBAT= 400 ADBAT= 143 QUEDBAT= 167924 INADBAT= 0
然後我注意到一些數據庫在沒有空格的情況下有不同的輸出:
CONDBAT=4000 MDBAT=1200 ADBAT=263 QUEDBAT=7924 INADBAT=0
我需要在 QUEDBAT 之後獲取值並將其儲存為變數。我的問題是我無法獲得兩個輸出的值。我嘗試了很多命令。例如:
grep -Eo 'QUEDBAT=([[:space:]]+[^[:space:]]+){1}' grep -vE -e 'QUEDBAT=[[:space:]]{4}' -e '^[^[:space:]]*$' grep -oP '(?<=QUEDBAT\=)(\s+)?\K([^ ]*)'
但他們不會返回兩個輸出的值。QUEDBAT 忽略任何空格後如何獲取值?
我無法編寫單獨的腳本,因為我需要一個腳本中所有數據庫的所有輸出。每次我執行儲存過程時,值都會改變,所以你不能確定每個部分的值是 3 位還是 4 位。而且我無法得到介於兩者之間的內容
=
,ADBAT
因為有時輸出的順序會不一樣。
+
是一個或多個。您需要*
零個或多個:grep -Po '\bQUEDBAT=\s*\K\d+'
或者:
pcregrep -o1 '\bQUEDBAT=\s*(\d+)'
或者使用真實的東西(上面的
P
/p
是用於perl
)的可移植性:perl -lne 'print $1 while /\bQUEDBAT=\s*(\d+)/g'
perl -lne 'print for /\bQUEDBAT=\s*(\d+)/g'
(或者編寫你的整個腳本,
perl
如果它主要是關於文本處理,可能會更合適)。
每當您的輸入有標籤=值對時,我發現最好首先創建一個數組來保存
f[]
下面的這些映射 (),然後您可以按任何輸入順序獲取您喜歡的值,比較它們,重新排序它們等等。只是他們的標籤。在每個 Unix 機器上的任何 shell 中使用任何 awk 都可以滿足您的特別要求:$ awk -F'[= ]+' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["QUEDBAT"]}' file 167924
但是通過首先使用這種建構標籤值數組的方法,您可以做更多的事情,例如:
$ awk -F'[= ]+' ' { for (i=1; i<NF; i+=2) f[$i]=$(i+1) } (f["QUEDBAT"] > 500) && (f["MDBAT"] < f["CONDBAT"]) { print f["INADBAT"], f["ADBAT"] } ' file 0 143