从尾部匹配awk时增加变量

时间:2018-04-27 09:19:34

标签: linux bash awk

我是从积极写入文件进行监控的:

我目前的解决方案是:

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?有更好的解决方案吗? (还有其他搜索术语被监控。)

1 个答案:

答案 0 :(得分: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