BASH脚本—无法从grepped输出中拆分字符串并将其逐个传递给变量



我是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);readarraymapfile的同义词

相关内容

  • 没有找到相关文章

最新更新