Linux 将AWK输出传递给BASH变量的问题
我试图解析BASH中错误日志中的行,然后将某个部分发送给BASH变量,以便稍后在脚本中使用,并且在尝试将其传递给BASH变量时出现问题 日志文件的外观:Linux 将AWK输出传递给BASH变量的问题,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我试图解析BASH中错误日志中的行,然后将某个部分发送给BASH变量,以便稍后在脚本中使用,并且在尝试将其传递给BASH变量时出现问题 日志文件的外观: 1446851818|1446851808.1795|12|NONE|DID|8001234 tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}') #!/bin/bash tail -n5 /var/log/ast
1446851818|1446851808.1795|12|NONE|DID|8001234
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
#!/bin/bash
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
echo "$brand";
我需要该行第三组中的数字(在本例中,数字是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
现在,如果我尝试将它分配给同一行/命令中的一个变量,我无法让它回显变量
分配给变量时,我的命令如下所示:
1446851818|1446851808.1795|12|NONE|DID|8001234
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
#!/bin/bash
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
echo "$brand";
(它是在与echo命令相同的脚本中运行的,因此变量应该很好,测试脚本如下所示:
1446851818|1446851808.1795|12|NONE|DID|8001234
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}')
#!/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
的文件的最新一行获取第三个字段,awk
几乎可以处理整个过程,而不需要tail
或grep
:
brand=$(awk -F '|' '/CONNECT/ {latest = $3} END {print latest}')
您需要捕获整个管道的输出,而不仅仅是管道的最后一部分:
brand=$(tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '|' '{print $3}')
您可能还想考虑如果在文件的最后五行中包含不止一行包含“代码>连接< /代码>会发生什么情况(或者实际上,如果没有),这将导致<代码>品牌<代码>具有多个(或没有)值。
如果您的目的是从包含
CONNECT
的文件的最新一行获取第三个字段,awk
几乎可以处理整个过程,而不需要tail
或grep
:
brand=$(awk -F '|' '/CONNECT/ {latest = $3} END {print latest}')
不是
foo | x=$(bar)
,而是x=$(foo | bar)
。管道的右侧在子shell中运行,因此当管道的那一侧退出时,在那里所做的更改将丢失:x=hello;echo再见| read x;echo$x
将输出hello
,而不是再见
。不是foo | x=$(bar)
=$(foo | bar)。管道的右侧在子shell中运行,因此当管道的那一侧退出时,在那里所做的更改将丢失:x=hello;echo再见| read x;echo$x
将输出hello
,而不是再见
。对,还将丢失grep:tail…| awk-F'.'''/{print$3}“
@Ed,我想了想,但是仅仅看最后五行的混乱让我停顿了下来。然而,根据你的评论,我添加了一个建议,表明与OP要求的略有不同,当然,这并不总是他们想要的:-)Re:搜索中的行数,我的live copy将其设置为-n1,因为它使用inotifywait并在文件被修改时立即检查文件,我手动运行此操作,最后一个带有适用短语的日志条目大约排了4行,所以我只是快速修改它,以便手动测试/运行。@paxdiablo我不是建议去掉尾部,just grep。如果CONNECT在最后5行中多次出现(first?last?all?),并且丢失grep,我真的不确定OP想要什么:tail…| awk-F'''''/CONNECT/{print$3}“
@Ed,我想了想,但是只看最后五行的混乱让我停顿了下来。但是,根据你的评论,我添加了一个建议,表明与OP要求的略有不同,当然,这并不总是他们想要的:-)Re:搜索中的行数,我的live copy将其设置为-n1,因为它使用inotifywait并在文件被修改时立即检查文件,我正在手动运行它,最后一个带有适用短语的日志条目大约排了4行,所以我只是快速修改它以便手动测试/运行。@paxdiablo我不是建议去掉尾部,只是建议删除grep。我真的不确定如果CONNECT在最后5行中多次出现(first?last?all?)