regex - sustituir - sed reemplazar/
cómo extraer subcadenas y números solo usando grep/sed (6)
Tengo un archivo de texto que contiene texto y números, quiero usar grep para extraer solo los números que necesito, por ejemplo, dado un archivo de la siguiente manera:
miss rate 0.21
ipc 222
stalls n shdmem 112
Así que supongamos que solo quiero extraer los datos de la miss rate
que es 0.21
. ¿Cómo lo hago con grep o sed? Además, necesito más de un número, no solo uno después del miss rate
. Es decir, es posible que desee obtener ambos 0.21
y 112
. Un resultado de muestra podría verse así:
0.21 222 112
Porque necesito los datos para la trama posterior.
La solución grep
and- cut
se vería así:
para obtener el tercer campo para cada uso exitoso de grep:
grep "^miss rate " yourfile | cut -d '' '' -f 3
o para obtener el tercer campo y el resto use:
grep "^miss rate " yourfile | cut -d '' '' -f 3-
O si usa bash y "tasa de error" solo aparece una vez en su archivo, también puede hacer:
a=( $(grep -m 1 "miss rate" yourfile) )
echo ${a[2]}
donde ${a[2]}
es su resultado.
Si la "tasa de error" ocurre más de una vez, puede recorrer el resultado de grep y leer solo lo que necesita. (en bash)
Puedes usar:
grep -P "miss rate /d+(/./d+)?" file.txt
o:
grep -E "miss rate [0-9]+(/.[0-9]+)?"
Ambos comandos imprimirán la miss rate 0.21
. Si desea extraer solo el número, ¿por qué no usar Perl, Sed o Awk?
Si realmente quieres evitarlos, ¿quizás esto funcione?
grep -E "miss rate [0-9]+(/.[0-9]+)?" g | xargs basename | tail -n 1
Si realmente quieres usar grep solo para esto, entonces puedes probar:
grep "miss rate" file | grep -oe ''/([0-9.]*/)''
Primero encontrará la línea que coincide y luego solo mostrará los dígitos.
Sed podría ser un poco más legible, sin embargo:
sed -n ''s#miss rate ##p'' file
Use awk
lugar:
awk ''/^miss rate/ { print $3 }'' yourfile
Para hacerlo solo con grep, necesita extensiones no estándar como aquí con GNU grep usando PCRE (-P) con lookbehind positivo (? <= ..) y solo coincide (-o):
grep -Po ''(?<=miss rate ).*'' yourfile
Creo
sed ''s|[^0-9]*/([0-9/.]*/)|/1 |g'' fiilename
hará el truco Sin embargo, cada entrada estará en su propia línea si eso está bien. Estoy seguro de que hay una manera para que sed produzca una lista delimitada por comas o espacios, pero no soy un súper maestro de todas las cosas sed.
Usando el look especial alrededor de regex trick / K con pcre engine con grep :
grep -oP ''miss rate /K.*'' file.txt
o con perl :
perl -lne ''print $& if /miss rate /K.*/'' file.txt