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의 적절한 위치에 이 네 줄을 포함하세요.
대신 다음과 같이 를 사용하여 일치하는 패턴만 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.