我是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"
上面的代码从日志文件中grep客户端名称,我试图使用grep客户端名称(每个)来构建每个客户端名称的日志文件。
客户端数量是不确定的,可能会随时变化。
我的代码返回客户端名称作为一个整体
assets: Apple
Samsung
Nokia.log
,我有点不确定如何切割字符串并逐个传递它以返回每个客户名称具有.log
的资产。我该怎么做?
Apple.log
Samsung.log
Nokia.log
(如果我误解了任务,请道歉)
使用awk
如果你的输入文件(我叫它clients.txt
)是:
Clients: Apple
Samsung
Nokia
以下awk
步骤:
awk '{print $NF".log"}' clients.txt
输出:
Apple.log
Samsung.log
Nokia.log
(如果管道流与上面示例中的文件内容相同,则可以直接管道到awk中并省略文件名)。
一个简单的awk
过程很可能可以执行从grep
处理的'clientlist'开始的整个任务(awk
具有内置grep
的所有功能),但我需要知道原始文件的结构来提取客户端名称。
一个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 "%sn" "${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
注意:使用mapfile
的替代答案解决了Charles Duffy评论中提到的问题(参见bash陷阱#50);readarray
是mapfile
的同义词