¿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 tr
otras 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, %a
es el número de bloques libres y %s
el tamaño del bloque, también lo %a * %s
es 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