
En Ubuntu la salida de este comando
df --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed -e /^Filesystem/d | awk '{print $6 " " $1 " " $3 " " $4 " " $5}'
es:
/ /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
/dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%
/dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
/var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%
Eso es lo que necesito.
En CentOS 6 obtengo este resultado:
/dev/mapper/vg_rproxy-lv_root
51475068 43192316 12% /
/boot /dev/sda1 82688 379364 18%
/dev/mapper/vg_rproxy-lv_home
77349888 73119692 1% /home
Es un desastre.
Salida completa de CentOS 6:
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_rproxy-lv_root
51475068 5661336 43192292 12% /
tmpfs 957140 0 957140 0% /dev/shm
/dev/sda1 487652 82688 379364 18% /boot
/dev/mapper/vg_rproxy-lv_home
77349888 294352 73119692 1% /home
¿Cuál es el problema? ¿Cómo puedo arreglarlo?
Respuesta1
tl; dr
Usar df -P
.
respuesta completa
/dev/mapper/vg_rproxy-lv_root
y /dev/mapper/vg_rproxy-lv_home
son hilos relativamente largos. Aparece df
en CentOSdecidepara dividir sus entradas en dos líneas, esto rompe la lógica cuando desea analizar más la salida.
En terminales estrechas, esto puede ser algo bueno, ya que crea una salida semicolumna legible por humanos incluso a pesar del espacio horizontal limitado. Preferiría que esto no sucediera cuando df
escribo en un objeto que no es tty (una tubería en su caso).
Tal vez df
en Ubuntu se comporta de manera similar si las entradas de la Filesystem
columna son largas; tal vez simplemente no experimentaste esto porque los tuyos son relativamente cortos. No lo sé, esto no es importante. Lo importante es que df
es una herramienta POSIX y debe seguirla especificación. Pero la especificación establece explícitamente:
Las implementaciones históricas
df
varían considerablemente en su resultado predeterminado. Por lo tanto, era necesario describir la salida predeterminada de manera flexible para dar cabida a todas las implementaciones históricas conocidas y agregar una opción portátil (-P
) para proporcionar información en un formato portátil.
Acerca de la opción:
-P
Produzca resultados en el formato descrito en la sección STDOUT.
Y finalmente la parte relevante de la sección STDOUT (el énfasis es mío):
La implementación puede ajustar el espaciado de la línea de encabezado y las líneas de datos individuales para que la información se presente en columnas ordenadas.
La producción restantecon
-P
consistirá enuna línea de información para cada sistema de archivos especificado. Estas líneas tendrán el formato siguiente:"%s %d %d %d %d%% %s\n", <file system name>, <total space>, <space used>, <space free>, <percentage used>, <file system root>
Por lo tanto, df
se permite generar cualquier cosa, a menos que use -P
. Sin -P
algunas implementaciones de df
puede producir resultados predecibles y analizables, otras... no tanto. Su comportamiento puede o no estar suficientemente documentado. Por lo tanto, en general, al analizar la salida de df
siempre debes usar -P
.
Probablemente simplemente agregar -P
será suficiente para solucionar su problema específico.
La nota -P
rige únicamente el formato. La especificación POSIX general se aplica solo en la configuración regional POSIX. Además, las implementaciones modernas de df
tienden a usar bloques de 1024 bytes de forma predeterminada, mientras que POSIX establece que el valor predeterminado es 512. En mi Debian 10 df
de GNU coreutils recurre al valor predeterminado de POSIX cuando POSIXLY_CORRECT
está configurado en el entorno. De forma portátil, puedes forzar bloques de 1024 bytes con -k
.
Este es un comando portátil que produce una salida (casi) analizable:
LC_ALL=POSIX df -Pk
Casi analizable, porque Filesystem
creo que las entradas de la columna pueden contener espacios; aunque en un sistema operativo correctamente configurado no es así.
Puede omitirlo LC_ALL=POSIX
y aun así obtener los resultados esperados, pero en general debería estar ahí para su análisis. Por ejemplo, en mi configuración regional polaca sed -e /^Filesystem/d
no hace su trabajo porque obtengo un término polaco para "sistema de archivos" de mi archivo df
. LC_ALL=POSIX
soluciona esto. Todavía mipersonalLa preferencia es no confiar en nada en el encabezado. Yo usaría sed 1d
o tail -n +2
; o delegue la tarea a awk
, ya que awk
ya está en su proceso. Esto sería:
LC_ALL=POSIX df -Pk --exclude={tmpfs,devtmpfs,squashfs,overlay} \
| awk 'NR>1 {print $6 " " $1 " " $3 " " $4 " " $5}'
Finalmente --exclude=
no es una opción portátil. Aparentemente funciona para usted en ambos sistemas en cuestión, aunque es posible que no funcione en otros sistemas.