Komutun çıktısını diziye kaydetme


23

Bu komut: pdc status -a 2>&1 | grep 'okay'Aşağıdaki çıktıyı verir

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

Bu komutu kabuk komut dosyasına yazdım. Ancak, bu komutun çıktısını, dizideki her bir dizin değerinde bazı işlemler için diziye depolamak istiyorum.

Bu komutun çıktısını diziye nasıl kaydedebilirim?

Yanıtlar:


24

Her satırın sonunda sadece rakamları istiyorsanız:

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

Her satırı dizide saklamak istiyorsanız

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

Verileri dizilerden almak için:

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
Sözdizimi hatası: kullandığımda yönlendirme beklenmedik,mapfile -t array < <(grep.....)
Sachith Muhandiram

Bash veya başka bir kabuk mu kullanıyorsunuz?
glenn jackman

20

Her şeyden önce, çıktı satırını satır satır işlemek için yapmanız gereken, dizi gerekmez.

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

Diziye ihtiyacınız varsa, Glenn Jackman zaten bunu yapmanın en iyi yolunu verdi , ancak işte başka bir yaklaşım:

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

Açıklama:

  • $IFS=$'\n': $IFSbash'ın giriş alanı ayırıcısıdır , onu yalnızca yeni satır karakterine ( \n) göre ayarlamak, çıkış satırlarınızın boşlukta bölünmemesini sağlar, böylece her satırı ayrı bir dizi öğesi olarak kaydedebilirsiniz. Bu olmazsa, emrinizin çıktısının her bir sözcüğü farklı bir öğe olacaktır.

    Ne yapmak istediğinize bağlı olarak, eski değeri kaydetmek $IFSve dizi okunduktan sonra geri yüklemek iyi bir fikir olabilir :

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Buna komut değiştirme adı verilir ve bir komutun çıktısını bir değişkende kaydetmenize olanak sağlar. Bunu yapmanın iki yolu vardır:

    var=$(command)

    ve

    var=`command`

    İkisinden $()daha iyidir çünkü:

    • İç içe komutlarla başa çıkabilir:

      var=$(command1 $(command 2))

      Örneğin var=$(cat $(find ~/))

    • Alıntı yapmakta daha az sorunu var ve daha temiz sözdizimi ile sonuçlanıyor. Daha fazlası için buraya bakın .


6

readarrayYerleşik kullanarak daha başka bir sezgisel yol (bkz. help -m readarray):

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

Ardından, bir dizi öğesini yazdırmak için ikinci öğeyi söyleyelim, şunu kullanabilirsiniz:

echo "${array[1]}"

Tüm dizi öğelerini ayrı satırlara yazdırmak için şunları kullanabilirsiniz:

printf -- "%s\n" "${array[@]}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.