2011-12-06 19 views
16

utilizo el comando df en un script bash:¿Cómo hacer que GREP seleccione solo valores numéricos?

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

Este script devuelve:

99% 

pero necesito sólo números (para hacer la siguiente comparación). Si utilizo la expresión regular grep sin el punto:

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

recibo nada. ¿Cómo solucionarlo?

Respuesta

36

Si intenta:

echo "99%" |grep -o '[0-9]*' 

Devuelve:

99 

Aquí está la información sobre la -o (o --only-matching bandera) trabaja desde el grep manual page.

Imprima solo las partes coincidentes (no vacías) de las líneas correspondientes, con cada una de esas partes en una línea de salida separada. Las líneas de salida usan los mismos delimitadores que la entrada, y los delimitadores son bytes nulos si también se usa -z (--null-data) (vea Other Options).

+0

también puede utilizar la alias '\ d' como' echo "99%" | grep -o '\ d *' ' –

+1

¿Estás seguro de eso @FabSa? ¿Has hecho una prueba? AFAK, grep uso predeterminado BRE .. – Kent

+2

Funciona para mí sí (en OsX) pero tal vez necesites el "extended-regexp" (con '-E') –

8

grep imprime ningún líneas coinciden con el patrón que proporcione. Si sólo desea imprimir la parte de la línea que coincide con el patrón, se puede pasar la opción -o :

-o, --only de coincidencia Imprimir sólo el emparejado (no vacío) partes de una línea coincidente, con cada una de esas partes en una línea de salida separada.

De esta manera:

echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+' 
+1

Esto no funcionará en todas las versiones/compilaciones de grep. Necesitará -P o -E Así que esto funcionará echo 'Aquí hay una línea que menciona el 99% en algún lugar' | grep -oP '[0-9] +' O echo 'Aquí hay una línea que menciona el 99% en algún lugar' | grep -oP '[0-9] +' –

1

¿Qué tal:

df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1 
1

No hay necesidad de grep se usa aquí, prueba esto:

df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'} 
1
function getPercentUsed() { 
    $sys = system("df -h /dev/sda6 --output=pcent | grep -o '[0-9]*'", $val); 
    return $val[0]; 
} 
0

No utilice más comandos de los necesarios dejar de lado la cola, grep y cortar. Usted puede hacer esto con solamente (un simple) awk

PS: dando un bloque de tamaño en print única de Persentage es un poco tonto ;-) Así que deja también la distancia "MB -B"

df.| Awk -F '[múltiples separadores de campo]' '$ NF == "Última campo debe ser exactamente -> patition montada" {print $ (NF-número del último campo)}'

en su caso, el uso:

df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}' 

de salida:

Si desea mostrar el símbolo de porcentaje, se puede dejar el -F '[%]' de distancia y su campo de impresión se desplazará 1 campo más atrás

df . |awk '$NF=="/" {print $(NF-1)}' 

de salida:81%

Cuestiones relacionadas