2010-10-29 20 views
6

Basit bir komutun içeriğini bir bash dizisine koymaya çalışıyorum, ancak biraz sorun yaşıyorum.AWK çıkışı bash Array

1% /dev 
1% /dev/shm 
1% /var/run 
0% /var/lock 
22% /boot 
22% /home 
22% /home/steve 

Sonra bir bash diziye dizi bu satırların her biri koymak istiyorum = $ (df:

df -h | awk '{ print $5" "$6 }' 

çıktı şuna benzer sistemimde dosya sistemlerinde kullanılan yüzdesini verir -h | awk aşağıdaki alıyorum dizi bastırırken) Ancak

'{$ 6 $ 5 yazdırmak}':

5% 
/
1% 
/dev 
1% 
/dev/shm 
1% 
/var/run 
0% 
/var/lock 
22% 
/boot 
22% 
/home 
22% 
/home/steve 

Bash, diziyi beyaz boşluklara göre oluşturuyor ve satır sonlarını değil, bunu nasıl düzeltebilirim?

+0

Dizide yaptıktan sonra diziyle ne yapmak istersiniz? Demek istediğim ... muhtemelen bunu beceriksizce yapabilirsin ... –

+0

Komutun bir sonraki kısmı bu komuta benzeyen bir şeyi çalıştırmak olurdu ". -type f -exec du -sh {} \; | sort - h "seçilen dosya sisteminde (kullanıcı birinci bölümdeki diziden çok fazla doldurulan bir dosya sistemi seçer). Dosya sistemindeki en büyük 10 dosyayı göstermek için bu ikinci komutu değiştirmek istiyorum, böylece kullanıcı onları silmek isteyip istemediğini seçebilir –

cevap

9

IFS değişkenini (diziler için kullanılan sınırlayıcıyı) sıfırlamanız gerekir.

OIFS=$IFS #save original 
IFS=',' 
df -h | awk '{ print $5" "$6"," }' 
+0

Bu iyi çalışıyor –

+1

Bir şey değil. Bu sizin için doğru cevap olsaydı, kabul et ve cevap kabul et. –

+2

Komutu AWK komutunda atlayabilir ve "IFS" öğesini yeni satır olarak ayarlayabilirsiniz: "IFS = $" \ n'' (daha sonra IFS = $ OIFS'yi unutmayın). –

0

Bu kullanabilirsiniz:

eval array=($(df -h | awk '{ printf("\"%s %s\" ", $5, $6) }')) 
+1

"eval" ne için? Sadece AWK komutundaki ekstra tırnakları bırakın ve dizi atamasını doğrudan yapın. –

+1

Değerlendirmeyi kaldırın ve dizide yalnızca bir elem olsun ... –

1

Sen awk olmadan Bash bu yapabilirdi.

array=() 
while read -a line; do 
    array+=("${line[4]} ${line[5]}") 
done < <(df -h)