linux - 从尾部匹配 awk 时增加变量

标签 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?有更好的解决方案吗? (还有其他搜索词正在监控中。)

最佳答案

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

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

要设置变量“返回”,您可以使用 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

关于linux - 从尾部匹配 awk 时增加变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059183/

相关文章:

linux - 使用 bash 脚本批量重命名 FTP 服务器上的文件

linux - 在没有管道的 awk 之后使用 ps

c - 使用execvp后如何释放malloc创建的内存?

c++ - 使用gcc编译文件时出错,由权限拒绝引起

android - 如何监控 Android 上的传入和传出 IP 流量

regex - 如何正则表达式比较破折号中的字符串?

awk - gawk FS 将记录拆分为单个字符

c++ - 如何将用 linux 编写的 std::wstring 读入 windows

node.js - Node 冲突 : Nodejs -v works, 但不是 Node -v

bash - 如何获取分隔字符串中的字段数?