BASH: найти число в тексте -> переменная - PullRequest
4 голосов
/ 19 января 2011

Мне нужна небольшая помощь от сообщества:

У меня есть две строки в большом текстовом файле:

Connected clients: 42  
4 ACTIVE CLIENTS IN LAST 20 SECONDS  

Как мне найти, извлечь и присвоить числа переменным?

clients=42
active=4

САС, AWK, GREP? Какой из них мне следует использовать?

Ответы [ 3 ]

4 голосов
/ 19 января 2011
clients=$(grep -Po '^(?<=Connected clients: )([0-9]+)$' filename)
active=$(grep -Po '^([0-9]+)(?= ACTIVE CLIENTS IN LAST [0-9]+ SECONDS$)' filename)

или

clients=$(sed -n 's/^Connected clients: \([0-9]\+\)$/\1/p' filename)
active=$(sed -n 's/^\([0-9]\+\) ACTIVE CLIENTS IN LAST [0-9]\+ SECONDS$/\1/p' filename)
4 голосов
/ 19 января 2011
str='Connected clients: 42 4 ACTIVE CLIENTS IN LAST 20 SECONDS'

set -- $str
clients=$3
active=$4

Если это две строки, хорошо.

str1='Connected clients: 42'
str2='4 ACTIVE CLIENTS IN LAST 20 SECONDS'

set -- $str1
clients=$3
set -- $str2
active=$1

Чтение двух строк из файла может быть выполнено с помощью

{ read str1; read str2; } < file

Альтернативно, выполнитечтение и запись в AWK, и выкладывать результаты в Bash.

eval "$(awk '/^Connected clients: / { print "clients=" $3 }
             /[0-9]+ ACTIVE CLIENTS/ { print "active=" $1 }
            ' filename)"
1 голос
/ 19 января 2011

вы можете использовать awk

$ set -- $(awk '/Connected/{c=$NF}/ACTIVE/{a=$1}END{print c,a}' file)
$ echo $1
42
$ echo $2
4

присваивает $ 1, $ 2 соответствующим именам переменных по желанию

, если вы можете напрямую назначить с помощью объявления

$ declare $(awk '/Connected/{c=$NF}/ACTIVE/{a=$1}END{print "client="c;print "active="a}' file)
$ echo $client
42
$ echo $active
4
...