명령 출력에서 ​​숫자를 찾아 변수로 저장

명령 출력에서 ​​숫자를 찾아 변수로 저장

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의 적절한 위치에 이 네 줄을 포함하세요.

대신 다음과 같이 를 사용하여 일치하는 패턴만 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.

관련 정보