【问题标题】:Increment variable when matched awk from tail从尾部匹配 awk 时增加变量
【发布时间】:2018-10-08 02:37:21
【问题描述】:

我正在监视一个主动写入文件:

我目前的解决方案是:

ws_trans=0
sc_trans=0
tail -F /var/log/file.log | \
while read LINE
echo $LINE | grep -q -e "enterpriseID:"
if [ $? = 0 ]
then
((ws_trans++))
fi
echo $LINE | grep -q -e "sc_ID:"
if [ $? = 0 ]
then
((sc_trans++))
fi

printf "\r WSTRANS: $ws_trans \t\t SCTRANS: $sc_trans"

done

但是,当尝试使用 AWK 执行此操作时,我没有得到输出 - $ws_trans$sc_trans 仍然是 0

ws_trans=0
sc_trans=0

tail -F /var/log/file.log | \
while read LINE
echo $LINE | awk '/enterpriseID:/ {++ws_trans} END {print | ws_trans}'
echo $LINE | awk '/sc_ID:/ {++sc_trans} END {print | sc_trans}'

printf "\r WSTRANS: $ws_trans \t\t SCTRANS: $sc_trans"

done

尝试这样做以减少负载。我知道 AWK 不处理 bash 变量,它可能会让人很困惑,但我发现的唯一参考是 AWK 的非尾部应用程序。

如何将 AWK 变量分配给 bash ws_transsc_trans?有更好的解决方案吗? (还有其他搜索词受到监控。)

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    您需要使用-v选项传递变量,例如:

    $ var=0
    $ printf %d\\n {1..10} | awk -v awk_var=${var} '{++awk_var} {print awk_var}'
    

    要设置变量“back”,您可以使用declare,例如:

    $ declare $(printf %d\\n {1..10} | awk -v awk_var=${var} '{++awk_var} END {print "var=" awk_var}')
    $ echo $var
    $ 10
    

    您的脚本可以这样重写:

    ws_trans=0
    sc_trans=0
    
    tail -F /var/log/system.log |
    while read LINE
    do
        declare $(echo $LINE | awk -v ws=${ws_trans} '/enterpriseID:/ {++ws} END {print "ws_trans="ws}')
        declare $(echo $LINE | awk -v sc=${sc_trans} '/sc_ID:/ {++sc} END {print "sc_trans="sc}')
        printf "\r WSTRANS: $ws_trans \t\t SCTRANS: $sc_trans"
    done
    

    【讨论】:

    • 如何从 AWK 中恢复它? - 以便将awk_var 值恢复为var
    • @itChi 我更新了答案,试试declare
    • 太棒了,变量现在设置和更新,而不是达到单个值declare $(echo $LINE | awk -v ws_trans=${ws_trans} '/enterpriseID:/ {++ws_trans} END {print "ws_trans=" ws_trans}')(我知道我是一个重复使用同名的暴徒,稍后会修复)跟进问题,我可以在一个 awk 中进行两次搜索,并设置两个不同的变量?
    • @itChi 试试这个,它同时进行两次搜索echo $LINE | awk -v ws=${ws_trans} -v sc=${sc_trans} '/enterpriseID:/ {++ws; print "ws_trans="ws; next} /sc_ID:/ {++sc; print "sc_trans="sc}' 注意next的用法
    • 老兄,你是个传奇人物,我想知道为什么当我尝试这样做时它会打印出文件的其余部分。整个事情和接下来的单引号。你是神。非常感谢您今天的帮助。
    猜你喜欢
    • 2012-02-25
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多