2010-10-29 15 views
6

En essayant de placer le contenu d'une simple commande dans un tableau bash, j'ai un petit problème.Sortie AWK vers bash Array

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

donne le pourcentage utilisé dans les systèmes de fichiers sur mon système sortie ressemble à ceci:

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

Je voudrais ensuite mettre chacune de ces lignes dans un tableau bash array = $ (df -h | awk '{print $ 5 $ 6}')

Cependant, lorsque j'imprimer le tableau que je reçois le texte suivant:

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

Bash est la formation de la matrice basée sur les espaces blancs et non sur les sauts de ligne. Comment puis-je résoudre ce problème?

+0

Que voulez-vous faire avec le tableau après l'avoir dans bash? Je veux dire ... probablement que vous pouvez le faire dans awk ... –

+0

Eh bien, la prochaine partie du script serait d'exécuter quelque chose de similaire à cette commande "find -type f -exec du -sh {} \; h "sur le système de fichiers choisi (l'utilisateur choisira un système de fichiers qui se remplit trop à partir du tableau dans la première partie). Je voudrais modifier cette deuxième commande pour montrer juste les 10 plus grands fichiers dans le système de fichiers afin que l'utilisateur puisse choisir si les supprimer ou pas –

Répondre

9

Vous devez réinitialiser la variable IFS (le délimiteur utilisé pour les tableaux).

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

Cela fonctionne bien merci –

+1

De rien. Si c'était la bonne réponse pour vous, vous devriez augmenter et marquer comme la réponse acceptée. –

+2

Vous pouvez omettre la virgule dans la commande AWK et mettre 'IFS' à newline:' IFS = $ '\ n'' (ne pas oublier 'IFS = $ OIFS' par la suite). –

0

Vous pouvez utiliser ceci:

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

A quoi sert le 'eval'? Laissez simplement les guillemets supplémentaires dans la commande AWK et faites directement l'assignation du tableau. –

+1

supprime l'eval et vous obtiendrez un seul élem dans le tableau ... –

1

Vous pouvez le faire en Bash sans awk.

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