将AWK输出传递给BASH变量

时间:2015-11-09 01:20:10

标签: linux bash shell awk

我正在尝试解析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}'

代码行试图完成此任务:

  1. 抓住日志文件的最后几行
  2. 搜索短语(在本例中为connect,我使用相同的命令触发不同的项目)
  3. 将第三组中的数字分开,以便在其他地方使用
  4. 如果我运行上面的完整命令,它会成功运行:

    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技能基本但改进)

1 个答案:

答案 0 :(得分:6)

您需要捕获整个管道的输出,而不仅仅是它的最后一部分:

brand=$(tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '|' '{print $3}')

您可能还想考虑如果文件的最后五行中有多行包含CONNECT会发生什么(或者实际上,如果没有)。这会导致brand拥有多个(或没有)值。

如果您的目的是从包含CONNECT的文件中的最新一行获取第三个字段,awk可以完全处理整个内容而无需tail或{{1} }:

grep