Инкремент переменной при совпадении awk от хвоста - PullRequest
0 голосов
/ 27 апреля 2018

Я отслеживаю из активно записанного в файл:

Мое текущее решение:

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_trans и sc_trans? Есть ли лучшее решение? (Отслеживаются и другие поисковые запросы.)

1 Ответ

0 голосов
/ 27 апреля 2018

Вам необходимо передать переменные, используя опцию -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...