No es el mismo formato de salida de `df` en diferentes distribuciones de Linux

No es el mismo formato de salida de `df` en diferentes distribuciones de Linux

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_rooty /dev/mapper/vg_rproxy-lv_homeson hilos relativamente largos. Aparece dfen 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 dfescribo en un objeto que no es tty (una tubería en su caso).

Tal vez dfen Ubuntu se comporta de manera similar si las entradas de la Filesystemcolumna 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 dfes una herramienta POSIX y debe seguirla especificación. Pero la especificación establece explícitamente:

Las implementaciones históricas dfvarí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-Pconsistirá 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, dfse permite generar cualquier cosa, a menos que use -P. Sin -Palgunas implementaciones de dfpuede 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 dfsiempre debes usar -P.

Probablemente simplemente agregar -Pserá suficiente para solucionar su problema específico.

La nota -Prige únicamente el formato. La especificación POSIX general se aplica solo en la configuración regional POSIX. Además, las implementaciones modernas de dftienden a usar bloques de 1024 bytes de forma predeterminada, mientras que POSIX establece que el valor predeterminado es 512. En mi Debian 10 dfde GNU coreutils recurre al valor predeterminado de POSIX cuando POSIXLY_CORRECTestá 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 Filesystemcreo que las entradas de la columna pueden contener espacios; aunque en un sistema operativo correctamente configurado no es así.

Puede omitirlo LC_ALL=POSIXy 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/dno hace su trabajo porque obtengo un término polaco para "sistema de archivos" de mi archivo df. LC_ALL=POSIXsoluciona esto. Todavía mipersonalLa preferencia es no confiar en nada en el encabezado. Yo usaría sed 1do tail -n +2; o delegue la tarea a awk, ya que awkya 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.

información relacionada