2010-10-29 58 views
6

Im tratando de poner el contenido de un comando simple en una matriz bash sin embargo, estoy teniendo un poco de problemas.AWK salida a bash Array

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

da el porcentaje utilizado en los sistemas de archivos en mi sistema de salida es el siguiente:

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

Después me gustaría poner cada una de estas líneas en una matriz de fiesta matriz = $ (df -h | awk '{print $ 5 $ 6}')

Sin embargo, cuando imprimo la matriz consigo el siguiente:

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

Bash está formando una matriz basada en espacios en blanco y no en saltos de línea. ¿Cómo puedo solucionar esto?

+0

¿Qué desea hacer con la matriz después de tenerla en bash? Quiero decir ... probablemente puedas hacer eso en awk ... –

+0

Bueno, la siguiente parte del script sería ejecutar algo similar a este comando "find. -type f -exec du -sh {} \; | sort - h "en el sistema de archivos elegido (el usuario elegiría un sistema de archivos que se está llenando demasiado de la matriz en la primera parte). Me gustaría modificar este segundo comando para mostrar solo los 10 archivos más grandes en el sistema de archivos para que el usuario pueda elegir si eliminarlos o no –

Respuesta

9

Debe restablecer la variable IFS (el delímetro utilizado para las matrices).

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

Esto está funcionando bien gracias –

+1

De nada. Si esta fue la respuesta correcta para usted, debe votar y marcar como la respuesta aceptada. –

+2

Puede omitir la coma en el comando AWK y establecer 'IFS' en newline:' IFS = $ '\ n'' (no olvide 'IFS = $ OIFS' después). –

0

Usted puede usar esto:

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

¿Para qué sirve el 'eval'? Simplemente deje las comillas adicionales en el comando AWK y haga la asignación de la matriz directamente. –

+1

elimina la evaluación y obtendrás solo un elemento en la matriz ... –

1

Usted puede hacer esto en Bash y sin awk.

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