Przechowuj dane wyjściowe polecenia w tablicy

23

To polecenie: pdc status -a 2>&1 | grep 'okay'Daje następujące dane wyjściowe

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

Napisałem to polecenie w pliku skryptu powłoki. Chcę jednak zapisać dane wyjściowe tego polecenia w tablicy w celu przetworzenia każdej z wartości indeksu w tablicy.

Jak mogę zapisać dane wyjściowe tego polecenia w tablicy?

Prakash V Holkar
źródło

Odpowiedzi:

24

Jeśli chcesz tylko liczby na końcu każdej linii:

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

Jeśli chcesz zapisać każdą linię w tablicy

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

Aby pobrać dane z tablic:

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
Glenn Jackman
źródło
1
Błąd składniowy: nieoczekiwane przekierowanie, gdy korzystammapfile -t array < <(grep.....)
Sachith Muhandiram
Używasz bash lub innej powłoki?
glenn jackman
20

Po pierwsze, niekoniecznie potrzebujesz tablicy, aby przetwarzać dane wyjściowe linia po linii, możesz:

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

Jeśli potrzebujesz tablicy, Glenn Jackman już dał ci najlepszy sposób na zrobienie tego, ale oto inne podejście:

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

Wyjaśnienie:

  • $IFS=$'\n': $IFSjest separatorem pól wejściowych bash , ustawienie go tylko na znak nowej linii ( \n) gwarantuje, że linie wyjściowe nie zostaną podzielone na białe znaki, dzięki czemu można zapisać każdą linię jako osobny element tablicy. Bez tego każde słowo wyjściowe polecenia byłoby innym elementem.

    W zależności od tego, co chcesz zrobić, dobrym pomysłem może być zapisanie starej wartości $IFSi przywrócenie jej po odczytaniu tablicy:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Nazywa się to substytucją poleceń i pozwala zapisać wynik polecenia w zmiennej. Można to zrobić na dwa sposoby:

    var=$(command)

    i

    var=`command`

    Z tych dwóch $()jest lepiej, ponieważ:

    • Może poradzić sobie z zagnieżdżonymi poleceniami:

      var=$(command1 $(command 2))

      Na przykład var=$(cat $(find ~/))

    • Ma znacznie mniej problemów z cytowaniem i zapewnia czystszą składnię. Zobacz tutaj po więcej.

terdon
źródło
6

Jeszcze inny intuicyjny sposób korzystania z readarraywbudowanego (patrz help -m readarray):

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

Następnie, aby wydrukować element tablicy, powiedzmy drugi element, możesz użyć:

echo "${array[1]}"

Aby wydrukować wszystkie elementy tablicy w osobnych wierszach, możesz użyć:

printf -- "%s\n" "${array[@]}"
Radu Rădeanu
źródło