【发布时间】:2021-11-03 10:45:36
【问题描述】:
我正在尝试回显警报文件(命名为关键)的每一行的信息/变量,使用while read line 获取警报文件的每一行(关键文件上可能有很多行):
while read line
do
{
s=`grep -Po '(?<=(sender:)).*' critical| cut -d ',' -f1`
t=`grep -Po '(?<=(time:)).*' critical| cut -d '.' -f1`
d=`grep -Po '(?<=(.1.3.6.1.4.1.2285.1.1.8:)).*' critical| cut -d ',' -f1`
echo "Sender: $s" >>critical_body
echo "Time: $t" >>critical_body
echo "Description: $d" >>critical_body
}
done < critical
我需要的输出结构如下:
Sender: xyz1
Time: 2021/08/11 22:14:19
Description: Lost communication with device
Sender: xyz2
Time: 2021/08/13 15:58:02
Description: Memory usage is above normal: 10% free
但我得到以下信息,似乎变量值在一次迭代中全部打印出来,并用/n 分隔,而不是我想要的一个一个。
Sender: xyz1
xyz2
Time: 2021/08/11 22:14:19
2021/08/13 15:58:02
Description: Lost communication with device
Memory usage is above normal: 10% free
Sender: xyz1
xyz2
Time: 2021/08/11 22:14:19
2021/08/13 15:58:02
Description: Lost communication with device
Memory usage is above normal: 10% free
有人可以帮助我吗?我试图找出问题所在,我在 bash 脚本方面相对较新。
cat critical
2021-08-11 22:14:19,550 INFO [com.optimization.ems.snmp.FnTrapReceiver] raw trap record inserted: com.optimization.ems.ems.model.snmp.RawTrapid: null, oid: .1.3.6.1.4.1.2285.1.2.14, time: 2021/08/11 22:14:19.547, sender: xyz1, version: 2, varbind: .1.3.6.1.2.1.1.3.0:5d 11h 0m 35s 350ms,.1.3.6.1.6.3.1.1.4.1.0:.1.3.6.1.4.1.2285.1.2.14,.1.3.6.1.4.1.2285.1.1.6:xyz1,.1.3.6.1.4.1.2285.1.1.8:Lost communication with device,.1.3.6.1.4.1.2285.1.1.3:5,
2021-08-13 15:58:02,083 INFO [com.optimization.ems.snmp.FnTrapReceiver] raw trap record inserted: com.optimization.ems.ems.model.snmp.RawTrapid: null, oid: .1.3.6.1.4.1.2285.1.2.3, time: 2021/08/13 15:58:02.79, sender: xyz2, version: 2, varbind: .1.3.6.1.2.1.1.3.0:98d 21h 39m 6s 60ms,.1.3.6.1.6.3.1.1.4.1.0:.1.3.6.1.4.1.2285.1.2.3,.1.3.6.1.4.1.2285.1.1.2:15:58:02 13/08/2021,.1.3.6.1.4.1.2285.1.1.3:5,.1.3.6.1.4.1.2285.1.1.8:Memory usage is above normal: 10% free,
【问题讨论】:
-
我建议你使用 sed 来提取令牌。
-
请贴一个“关键文件”的例子
-
我发布了关键文件示例。
-
您正在为每一行处理整个
critical并忽略$line变量 -
@jhnc 如何在循环中使用 $line 变量?
标签: bash while-loop echo