コマンド出力で数字を見つけて変数として保存する

コマンド出力で数字を見つけて変数として保存する

Bashスクリプトからコマンド出力からいくつかの数値を取得し、変数に保存したいと思います。コマンド出力の例:

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

前のコマンド出力の4つの数字を名前付き変数に保存したいと思います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コマンドを使用できます。awkgrep

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の適切な場所にこの4行を含めてください。

代わりに、次のようにを使用して一致するパターンのみを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

出力がoutputという変数にあると仮定すると、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シェルでは:

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.

関連情報