cortar/grep y df -h

cortar/grep y df -h

¿Cómo puedo agarrar o cortar el "173G" en "Verf"?

Necesito esto para secuencias de comandos Unix en la escuela.

jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2       293G    121G  173G   42% /media/Windows

Respuesta1

La solución más cómoda para tal tarea es awk:

df -h /dev/sda2 | awk 'NR==2{print$4}'

O si se enumeran más particiones, puede elegir la línea correcta junto al punto de montaje:

df -h | awk '$1=="/dev/sda2"{print$4}'

También es simple sed, pero menos agradable si necesita depurarlo algunos montajes más tarde:

df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*/\2/p'

df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*/\2/p'

Eso supone GNU sed. La sintaxis compatible con POSIX incluye muchos sistemas de escape:

df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'

df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'

Respuesta2

Si debe usar grep y cut, puede hacer lo siguiente:

df -h /dev/sda2 | grep sda | cut -d" " -f14

Pero esto es bastante feo, ya que tienes que contar los espacios (-f14) y la razón por la que @manatwork usó awk. Podrías usar trotras herramientas para hacerlo más agradable y poder especificar el campo real que deseas cortar:

df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4

Alternativamente, el grep más nuevo admite generar solo una coincidencia parcial y puedes usarlo en combinación con un truco de bash:

df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3

La expresión regular podría ser más segura, pero encontrará todos los campos de tamaño y los generará uno por línea, mientras que cortar selecciona el segundo.

Respuesta3

Todas las demás respuestas aquí son geniales, pero si usasIntento, no es necesario utilizar programas externos como awk, sed, grep, cut, etc.

La siguiente línea hará lo que quieras:

{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)

"$av"será el tamaño disponible en /dev/sda1

Si desea utilizar sólo la parte numérica de"$av"( p.ej123en 123G), puedes usarExpansión de parámetrospara recortar la parte irrelevante así:

ir="${av##*[0-9]}"; echo "${av%$ir}"

o simplemente "${av%?}"si estás seguro de que el sufijo de"$av"es solo una letra.

Respuesta4

Si no tiene que ser grep/ cut, es posible que pueda obtener la misma información usando stat. En el modo de sistema de archivos, %aes el número de bloques libres y %sel tamaño del bloque, también lo %a * %ses el espacio libre en bytes, y puedes hacer cálculos a tu gusto para descomponerlo en una unidad más adecuada de tu elección, por ejemplo:

echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB

información relacionada