명령어 출력을 배열에 저장


23

이것은 명령입니다 : pdc status -a 2>&1 | grep 'okay'그것은 다음과 같은 출력을 제공합니다

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

이 명령을 쉘 scrip 파일에 작성했습니다. 그러나 배열의 각 인덱스 값에 대한 처리를 위해이 명령의 출력을 배열에 저장하고 싶습니다.

이 명령의 출력을 배열에 어떻게 저장할 수 있습니까?

답변:


24

각 줄의 끝에 숫자를 원할 경우 :

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

각 줄을 배열에 저장하려면

mapfile -t lines < <(pdc ...)

배열에서 데이터를 검색하려면

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
구문 오류 : 내가 사용할 때 예기치 않은 리디렉션mapfile -t array < <(grep.....)
Sachith Muhandiram

bash 또는 다른 쉘을 사용하고 있습니까?
glenn jackman

20

우선, 출력을 한 줄씩 처리하기 위해 반드시 배열이 필요하지는 않습니다.

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

배열이 필요한 경우 Glenn Jackman은 이미 최선의 방법을 제공했지만 다음과 같은 다른 방법이 있습니다.

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

설명:

  • $IFS=$'\n': $IFS는 bash의 입력 필드 구분 기호 이며 개행 문자 만 ( \n)으로 설정하면 출력 행이 공백으로 분할되지 않으므로 각 행을 별도의 배열 요소로 저장할 수 있습니다. 이것없이 각각 명령 출력의 단어 는 다른 요소가됩니다.

    수행하려는 작업에 따라 이전 값을 저장 $IFS하고 배열을 읽은 후 복원 하는 것이 좋습니다 .

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): 이것을 명령 대체 라고하며 명령 의 출력을 변수에 저장할 수 있습니다. 이를 수행하는 두 가지 방법이 있습니다.

    var=$(command)

    var=`command`

    둘 중 다음 $()이 더 좋습니다.

    • 중첩 된 명령을 처리 할 수 ​​있습니다.

      var=$(command1 $(command 2))

      예를 들어 var=$(cat $(find ~/))

    • 인용과 관련된 문제가 훨씬 적고 구문이 더 깨끗합니다. 자세한 내용은 여기 를 참조 하십시오 .


6

readarray내장을 사용하는 또 다른 직관적 인 방법 (참조 help -m readarray) :

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

다음으로 배열 요소를 인쇄하려면 두 번째 요소를 사용하십시오.

echo "${array[1]}"

모든 배열 요소를 별도의 줄에 인쇄하려면 다음을 사용하십시오.

printf -- "%s\n" "${array[@]}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.