【发布时间】:2011-06-11 09:49:51
【问题描述】:
我几乎不需要社区的帮助:
我在一个大文本文件中有这两行:
Connected clients: 42
4 ACTIVE CLIENTS IN LAST 20 SECONDS
如何查找、提取数字并将其分配给变量?
clients=42
active=4
SED、AWK、GREP?我应该使用哪一个?
【问题讨论】:
我几乎不需要社区的帮助:
我在一个大文本文件中有这两行:
Connected clients: 42
4 ACTIVE CLIENTS IN LAST 20 SECONDS
如何查找、提取数字并将其分配给变量?
clients=42
active=4
SED、AWK、GREP?我应该使用哪一个?
【问题讨论】:
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)
【讨论】:
^ 和 $ 来松开它们。它们还受到嵌入空间的限制。您可以将字符串中的每个空格更改为[[:blank:]]*。您还可以尝试将字符串缩短到任何对明确选择性至关重要的部分。您会收到错误消息还是无法匹配?
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)"
【讨论】:
你可以使用 awk
$ set -- $(awk '/Connected/{c=$NF}/ACTIVE/{a=$1}END{print c,a}' file)
$ echo $1
42
$ echo $2
4
根据需要将 $1、$2 分配给适当的变量名
如果可以直接使用 declare 赋值
$ declare $(awk '/Connected/{c=$NF}/ACTIVE/{a=$1}END{print "client="c;print "active="a}' file)
$ echo $client
42
$ echo $active
4
【讨论】: