我有几百行,如下所示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 赋值语句:
仅在行的开头 (
^
) 将任意序列的破折号和数字 ([-0-9]*
) 后跟一个或多个空格 (*
) 替换为date=
:s/^[-0-9]* */date=/
替换逗号后跟任意字符 (
.*
),后跟thisOne=
空格:s/,.*thisOne={/ /
删除右大括号 (
}
),后跟任何其他字符 (.*
) 到行的(隐含的)末尾:s/}.*//
将所有逗号 (
,
) 替换为空格:s/,/ /g
|
在示例脚本中,我建议暂时删除到文件末尾的管道并仅运行sed
脚本的命令部分,以便您可以进行试验并了解其工作原理。