Cómo obtener una subcadena del comando bash

8

Dada la siguiente subcadena dada obtenida del comando df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Me gustaría extraer 1952971772y 74%de esa cadena, usarlo en un script bash.

Sé que podría usar algunos comandos de corte o algo así, pero ya no funcionará si un tamaño cambia, por ejemplo.

También tuve pensamientos sobre el uso de una expresión regular o algo así, pero me gustaría tener el enfoque más recomendado.

¡Gracias por adelantado!

Nicolas DUVOISIN
fuente
2
¿Está preguntando sobre el caso general, o sobre el dfparticular? Si es lo último, puede especificar explícitamente campos de salida particulares, por ejemplodf --output=pcent /dev/sdb1
steeldriver
2
Está utilizando la cutposición del carácter en línea, lo que hace que falle cuando la longitud de la línea cambia con las fluctuaciones en el tamaño del archivo. Creo que puede indicar cutque seleccione una columna 2y una columna 5delimitadas por espacios, pero estoy en el teléfono y no puedo investigar y publicar una respuesta de manera efectiva.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix El número de espacios puede variar, por lo que es difícil saber qué número de columna es el correcto. cutverá una columna después de cada delimitador.
mook765
Creo que dos o más espacios contiguos todavía cuentan como un solo espacio para delinear columnas
WinEunuuchs2Unix
@ WinEunuuchs2Unix correcto :) I los comandos de un archivo de texto que tengo a la mano: D
Rinzwind

Respuestas:

6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

para el porcentaje y

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

Por el tamaño.

Sin el tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    obtiene la segunda columna donde los separadores múltiples cuentan como 1. Entonces, la segunda columna es siempre la misma para su sistema para la primera parte del comando.

  • NR le proporciona el número total de registros que se procesan o el número de línea.

Rinzwind
fuente
1
O si necesita ambos en una línea df /home | awk '{print $2; print $5;}'.
Videonauth
3
Awk mantiene la última línea en el ENDbloque, así que en lugar de usar tailsolo useawk 'END { print $2,$5}'
Kevin
FYI nombre te dejó en Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix
8

Respuesta editada

Como dijo @kevin, puede usar awkpara seleccionar solo la última línea y evitar usar cola usando ENDy también, si desea imprimir dos columnas a la vez, puede hacer esto:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Respuesta original

Solo puede seleccionar las segundas columnas:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Donde $2indica la posición de las columnas separadas por TAB. Puede usarlo cutporque maneja solo una aparición de TAB y aquí hay múltiples TAB para delimitar una columna.

noraj
fuente
3
Awk mantiene la última línea en el ENDbloque, así que en lugar de usar tailsolo useawk 'END { print $2,$5}'
Kevin