我正在尝试解析BASH中的错误日志中的行,然后将某个部分发送到BASH变量,以便稍后在脚本中使用,并在我尝试将其传递给BASH变量时出现问题。
日志文件的样子:
1446851818|1446851808.1795|12|NONE|DID|8001234
我需要第<3>组中的数字(在这种情况下,数字是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技能基本但改进)
答案 0 :(得分:6)
您需要捕获整个管道的输出,而不仅仅是它的最后一部分:
brand=$(tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '|' '{print $3}')
您可能还想考虑如果文件的最后五行中有多行包含CONNECT
会发生什么(或者实际上,如果没有)。这会导致brand
拥有多个(或没有)值。
如果您的目的是从包含CONNECT
的文件中的最新一行获取第三个字段,awk
可以完全处理整个内容而无需tail
或{{1} }:
grep