在命令输出中查找数字并将其保存为变量

在命令输出中查找数字并将其保存为变量

在 bash 脚本中,我希望从命令的输出中获取一些数字并将它们存储在变量中。命令输出的示例:

25 results [22 valid, 2 invalid, 1 undefined]

我想将上一个命令输出中的四个数字保存为名为 的变量results, valid, invalid, undefined

答案1

由于您想要存储多个单独的值,我假设您想要将它们存储在数组中:

$ str='25 results [22 valid, 2 invalid, 1 undefined]'

$ readarray -t arr < <( grep -E -o '[0-9]+' <<<"$str" )

这会将 的输出读取grep到名为 的数组中arr。该grep命令将$str通过将扩展正则表达式[0-9]+与字符串进行匹配并提取每个匹配项来输出在其自己的行中找到的每个单独的数字。 grep从“here-string”读取字符串,并使用过程替换readarray读取结果。grep

然后这些值可以用作

$ printf 'value: %s\n' "${arr[@]}"
value: 25
value: 22
value: 2
value: 1

或者,要查看各个值,请使用例如"${arr[0]}""${arr[1]}"等。数组包含"${#arr}"值。

results=${arr[0]}
valid=${arr[1]}
invalid=${arr[2]}
undefined=${arr[3]}

读书直接地来自命令:

readarray -t arr < <( mycommand | grep -E -o '[0-9]+' )

答案2

假设该命令的输出保存在名为 的文件中output.txt,那么您可以使用命令awk和 ,grep如下所示:

results=$(grep results output.txt | awk '{print $1}')    
valid=$(grep valid output.txt | awk '{print $3}' | tr -d [])
invalid=$(grep invalid output.txt | awk '{print $5}' | tr -d [])
undefined=$(grep undefinedoutput.txt | awk '{print $7}' | tr -d [])

将这四行包含在您的 bash 中合适的位置。

相反,您只能使用awk来查找匹配模式,如下所示:

results=$(awk '/results/{ print $1 }' output.txt)
valid=(awk '/valid/{ print $3 }' output.txt | tr -d [])
invalid=(awk '/invalid/{ print $5 }' output.txt | tr -d [])
undefined=(awk '/undefined/{ print $7 }' output.txt | tr -d [])

答案3

假设您的输出位于名为输出的变量中,您可以使用 sed 将其拆分,仅保留空格和数字,以便您轻松地将“单词”拆分为数组:

tim@host:~$ res=($(sed 's/[^0-9 ]*//g' <<< $output))
tim@host:~$ printf "results: %s\nvalid: %s\ninvalid: %s\nundefined: %s\n" "${res[@]}"
results: 25
valid: 22
invalid: 2
undefined: 1

答案4

在任何 POSIX shell 上:

a='aja 25 results [22 valid, 2 invalid, 1 undefined]'

set --                         # clean the list of argumnets.
while [ ${#a} -gt 0 ]; do      # while a is not empty, loop.
    b=${a%%[0-9]*}             # extract leading characters that are not digits (if any).
    a=${a#"$b"}                # remove those from the source variable.
    b=${a%%[^0-9]*}            # extract the leading digits.
    set -- "$@" ${a:+"$b"}     # until a empty, add numbers to the list.
    a=${a#"$b"}                # remove the digits from the source string.
done

printf '<%s> ' "$@"; echo      # print the list of values.

相关内容