将一行的字段提取到 shell 变量中

将一行的字段提取到 shell 变量中

我有几百行,如下所示connRefused.log:-

        2015-12-12 00:12:10,227 ERROR [Testing-KeepAlive-01] c.v.v.v.Connection [Connection.java : 001] failed to bind to {name=TestGW,direction=BOTH_WAY,username=espada,password=whatever,binds=1,keepAliveInterval=60000,params={Payload=0, useEXP=1},thisOne={id=1001,name=TestGw,ip=192.168.0.1,port=88}}: Connection refused

下面是我的脚本的一部分(简化),用于读取connRefused.log数组

IFS=$'\n' read -d '' -r -a lines < /path/log/connRefused.log
for xx in "${lines[@]}"
  do
    ??? # what to do here?
    echo $Date
    echo $ID
    echo $Name
    echo $IP
    echo $Port
  done

如何从上面的行中获取所需的数据并将其存储在变量日期、ID、名称、IP、端口中?

thisOne={id=1001,name=TestGw,ip=192.168.0.1,port=88}

对于 $Date,我只需要时间部分。

答案1

您不需要使用数组。由于输入数据看起来非常规则,因此我会将输入数据转换为shell赋值语句,然后将它们读入shell并计算。像这样:

#!/bin/sh

sed '
    s/^[-0-9]*  */date=/
    s/,.*thisOne={/ /
    s/}.*//
    s/,/ /g
' "$@" |
while read line
do
    eval $line
    echo date=$date
    echo id=$id
    echo name=$name
    echo ip=$ip
    echo port=$port
done

sed命令将输入​​行转换为:

date=00:12:10 id=1001 name=TestGw ip=192.168.0.1 port=88

while循环一次读取一行,并eval $line导致该行在 shell 中执行,从而将变量设置为给定值。

该脚本将处理来自命令行或标准输入的文件名(请注意命令"$@"末尾的sed)。

sed命令通过一系列s(替代)命令将该行转换为 shell 赋值语句:

  1. 仅在行的开头 ( ^) 将任意序列的破折号和数字 ( [-0-9]*) 后跟一个或多个空格 ( *) 替换为date=

    s/^[-0-9]*  */date=/
    
  2. 替换逗号后跟任意字符 ( .*),后跟thisOne=空格:

    s/,.*thisOne={/ /
    
  3. 删除右大括号 ( }),后跟任何其他字符 ( .*) 到行的(隐含的)末尾:

    s/}.*//
    
  4. 将所有逗号 ( ,) 替换为空格:

    s/,/ /g
    

|在示例脚本中,我建议暂时删除到文件末尾的管道并仅运行sed脚本的命令部分,以便您可以进行试验并了解其工作原理。

相关内容