繁体   English   中英

将AWK输出传递到BASH变量的问题

[英]Issues passing AWK output to BASH Variable

我正在尝试从BASH中的错误日志中解析行,然后将某个部分发送到BASH变量中,以供稍后在脚本中使用,并且在尝试将其传递给BASH变量时出现问题。

日志文件如下所示:

1446851818|1446851808.1795|12|NONE|DID|8001234

我需要该行的第三组中的数字(在这种情况下,该数字是12)

这是我正在运行的命令的示例:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}'

该行代码试图实现这一点:

  1. 抓取日志文件的最后几行
  2. 搜索短语(在这种情况下,connect,我使用相同的命令来触发不同的项)
  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技能很基本,但正在提高)

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

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

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


如果您打算从包含CONNECT的文件的最新行中获取第三个字段,则awk几乎可以处理整个事情,而无需tailgrep

brand=$(awk -F '|' '/CONNECT/ {latest = $3} END {print latest}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM