我是 bash 腳本的初學者,并且一直在撰寫腳本來檢查不同的日志檔案,但我有點卡在這里。
clientlist=/path/to/logfile/which/consists/of/client/names
#i will grep only the client name from the file which has multiple log lines
clients=$(grep --color -i 'list of client assets:' $clientlist | cut -d":" -f1 )
echo "Clients : $clients"
#For example "Clients: Apple
# Samsung
# Nokia"
#number of clients may vary from time to time
assets=("$clients".log)
echo assets: "$assets"
上面的代碼從日志檔案中 greps 客戶端名稱,我正在嘗試使用 grepped 客戶端名稱(每個)來構造一個包含每個客戶端名稱的日志檔案。
客戶的數量是不確定的,并且可能會不時變化。
我擁有的代碼整體回傳客戶端名稱
assets: Apple
Samsung
Nokia.log
而且我有點不確定如何剪切字串并將其逐個傳遞以回傳.log每個客戶名稱所具有的資產。我怎樣才能做到這一點 ?
Apple.log
Samsung.log
Nokia.log
uj5u.com熱心網友回復:
(如果我誤解了任務,請道歉)
使用awk
如果您的輸入檔案(我稱之為clients.txt)是:
Clients: Apple
Samsung
Nokia
以下awk步驟:
awk '{print $NF".log"}' clients.txt
輸出:
Apple.log
Samsung.log
Nokia.log
(如果管道流與上述示例中的檔案內容一樣,您可以直接通過管道進入 awk 并省略檔案名)。
很可能一個簡單的awk程序可以從您處理的“客戶串列”開始執行整個任務grep(awk具有grep內置的所有功能),但我需要知道原始檔案的結構才能提取客戶名稱.
uj5u.com熱心網友回復:
一個awk想法:
assets=( $(awk -F: '/list of client assets:/ {print $2".log"}' "${clientlist}") )
# or
mapfile -t assets < <(awk -F: '/list of client assets:/ {print $2".log"}' "${clientlist}")
在哪里:
-F:- 將輸入欄位分隔符定義為:/list of client assets:/- 對于包含字串的行,list of clients assets:列印第二個:分隔欄位并.log在末尾附加字串
一個sed想法:
assets=( $(sed 's/.*://; s/$/.log/' "${clientlist}") )
# or
mapfile -t assets < <(sed 's/.*://; s/$/.log/' "${clientlist}")
在哪里:
s/.*://- 剝離一切直到:s/$/.log/- 將行尾替換為.log
兩者都生成:
$ typeset -p assets
declare -a assets=([0]="Apple.log" [1]="Samsung.log" [2]="Nokia.log")
$ echo "${assets[@]}"
Apple.log Samsung.log Nokia.log
$ printf "%s\n" "${assets[@]}"
Apple.log
Samsung.log
Nokia.log
$ for i in "${!assets[@]}"; do echo "assets[$i] = ${assets[$indx]}"; done
assets[0] = Apple.log
assets[1] = Samsung.log
assets[2] = Nokia.log
注意:使用解決 Charles Duffy 評論中提到的問題的替代答案mapfile(參見bash pitfall #50);readarray是同義詞mapfile
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531356.html
標籤:细绳重击壳grep
