Simpan output dari perintah ke dalam array


23

Ini adalah perintah: pdc status -a 2>&1 | grep 'okay'Ini memberikan output berikut

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

Saya telah menulis perintah ini dalam file skrip shell. Tapi saya ingin menyimpan output dari perintah ini ke dalam array untuk diproses pada setiap nilai indeks dalam array.

Bagaimana saya bisa menyimpan output dari perintah ini ke dalam array?

Jawaban:


24

Jika Anda hanya ingin angka pada akhir setiap baris:

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

Jika Anda ingin menyimpan setiap baris ke dalam array

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

Untuk mengambil data dari array:

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
Kesalahan sintaks: pengalihan tidak terduga, ketika saya menggunakanmapfile -t array < <(grep.....)
Sachith Muhandiram

Apakah Anda menggunakan bash atau shell lain?
glenn jackman

20

Pertama-tama, Anda tidak perlu array, untuk memproses output baris demi baris yang dapat Anda lakukan:

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

Jika Anda benar-benar membutuhkan array, Glenn Jackman sudah memberi Anda cara terbaik untuk melakukannya tetapi inilah pendekatan lain:

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

Penjelasan:

  • $IFS=$'\n': $IFSadalah pemisah bidang input bash , mengaturnya ke karakter baris baru saja ( \n) memastikan bahwa garis output Anda tidak akan terpecah pada spasi putih sehingga Anda dapat menyimpan setiap baris sebagai elemen array terpisah. Tanpa ini, setiap kata dari output perintah Anda akan menjadi elemen yang berbeda.

    Bergantung pada apa yang ingin Anda lakukan, mungkin ide yang baik untuk menyimpan nilai lama $IFSdan mengembalikannya setelah array dibaca:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Ini disebut substitusi perintah dan memungkinkan Anda untuk menyimpan output dari suatu perintah dalam suatu variabel. Ada dua cara untuk melakukan hal ini:

    var=$(command)

    dan

    var=`command`

    Dari keduanya, $()lebih baik karena:

    • Itu dapat menangani perintah bersarang:

      var=$(command1 $(command 2))

      Sebagai contoh var=$(cat $(find ~/))

    • Ini memiliki masalah jauh lebih sedikit dengan mengutip dan menghasilkan sintaks yang lebih bersih. Lihat di sini untuk lebih lanjut.


6

Namun cara lain yang lebih intuitif menggunakan readarraybuiltin (lihat help -m readarray):

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

Selanjutnya, untuk mencetak elemen array, misalkan elemen kedua, Anda dapat menggunakan:

echo "${array[1]}"

Untuk mencetak semua elemen array pada baris terpisah, Anda dapat menggunakan:

printf -- "%s\n" "${array[@]}"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.