Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将AWK输出传递给BASH变量的问题_Linux_Bash_Shell_Awk - Fatal编程技术网

Linux 将AWK输出传递给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

我试图解析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/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}'
这行代码正试图实现这一点:

  • 抓取日志文件的最后几行
  • 搜索短语(在本例中为connect,我使用相同的命令触发不同的项)
  • 将第三组行中的数字分开,以便在其他地方使用
  • 如果我运行上述完整命令,它将成功运行,如下所示:

    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?)