【发布时间】:2016-02-09 15:00:28
【问题描述】:
我正在尝试从 BASH 中的错误日志中解析行,然后将某个部分发送到 BASH 变量,以便稍后在脚本中使用,并且在尝试将其传递给 BASH 变量时遇到问题。
日志文件的样子:
1446851818|1446851808.1795|12|NONE|DID|8001234
我需要该行的第三组(在本例中为 12)中的数字
这是我正在运行的命令的示例:
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}'
该行代码正在尝试完成此操作:
- 获取日志文件的最后几行
- 搜索一个短语(在本例中为连接,我使用相同的命令来触发不同的项)
- 将第三组中的数字分开,以便在其他地方使用
如果我运行上面的完整命令,它会像这样成功运行:
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}'
12
现在,如果我尝试将它分配给同一行/命令中的变量,我无法让它回显该变量。
分配给变量时的命令如下所示:
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
(它与 echo 命令在同一脚本中运行,因此变量应该没问题,测试脚本如下所示:
#!/bin/bash
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
echo "$brand";
我知道这很可能不是最有效/最有说服力的解决方案,所以如果有其他想法/方法可以实现这一点,我也愿意接受他们(我的 BASH 技能是基本的,但正在改进)
【问题讨论】:
-
不是
foo | x=$(bar),而是x=$(foo | bar)。 -
管道的右侧在子外壳中运行,因此当管道的那一侧退出时,在那里所做的更改会丢失:
x=hello; echo good-bye | read x; echo $x将输出hello,而不是good-bye。