【问题标题】:BASH: Find number in text -> variableBASH:在文本中查找数字 -> 变量
【发布时间】:2011-06-11 09:49:51
【问题描述】:

我几乎不需要社区的帮助:

我在一个大文本文件中有这两行:

Connected clients: 42  
4 ACTIVE CLIENTS IN LAST 20 SECONDS  

如何查找、提取数字并将其分配给变量?

clients=42
active=4

SED、AWK、GREP?我应该使用哪一个?

【问题讨论】:

    标签: shell sed awk grep


    【解决方案1】:
    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)
    

    【讨论】:

    • 这就是我要找的。不幸的是,只有一项工作,即使用 grep 的活动行。为什么第一个带有 grep 的“客户”行不起作用?使用 sed 的解决方案也不起作用。这是文本文件:d.pr/tVhg+
    • @Adrian:我的回答中的命令非常严格。您可以通过移除锚点 ^$ 来松开它们。它们还受到嵌入空间的限制。您可以将字符串中的每个空格更改为[[:blank:]]*。您还可以尝试将字符串缩短到任何对明确选择性至关重要的部分。您会收到错误消息还是无法匹配?
    • grep -Po '(?
    【解决方案2】:
    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)"
    

    【讨论】:

    • 不是最好的。我在一个大文本文件中有这两行,在另一个文本之间。更新:对不起,字符串是两行,而不是一行。
    【解决方案3】:

    你可以使用 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
    

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      相关资源
      最近更新 更多