
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
コマンドを使用できます。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の適切な場所にこの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.