2009-09-24 11 views
10

Tengo un archivo enorme en mi servidor UNIX de la que necesito para extraer ciertas partesobtener una parte de una línea después de grep

El formato de la línea es

aNumber timestamp commandInformation 

utilizo el comando

grep LATENCY file.log | grep CMDTYPE=NEW 

para filtrar ciertas líneas que quiero. Solo quiero que se devuelva la marca de tiempo de la parte y los últimos 9 caracteres de la línea, no la línea completa. ¿Cómo puedo hacer eso?

Respuesta

10

Uso awk(1):

awk ' { print $2" "substr($0,length($0)-8) }' 
+1

+1 por ser más rápido que yo :) –

1

Usted puede utilizar awk de la siguiente manera:

grep LATENCY file.log | grep CMDTYPE=NEW | awk '{print $2,substr($0,length($0)-9,9)}' 
+0

No sería el uso de $ 0 asegurarle exhiba el final de la línea en lugar de solo el final de la tercera palabra? –

+0

@Yannick: sí, asumí sin ningún motivo que 'commandInformation' sería solo una palabra. Se corrigió la publicación con tu sugerencia, ¡gracias! –

0

No hay necesidad de usar grep, awk puede hacer eso también:

awk '/LATENCY/ && /CMDTYPE=NEW/ {print $2 " " substr($0, length($0)-8)}' file 
2

I' Voy a argumentar Perl es una mejor opción que awk aquí:

perl -ne 'next if ! (/LATENCY|CMDTYPE=NEW/ && /^\d+.*\s+(.*)\s+.*(.{9})$/); print "$2 $3\n";' 

La expresión regular es más robusta, lo que le permite omitir las líneas que no coinciden con el patrón más estricto. Los scripts awk de arriba van a ver desbordamientos en la llamada de subser (honestamente no sé qué hacen los índices negativos en awk) si le das entrada rota como líneas parciales desde el final de un registro.

0

Usted puede hacer todo con sed solo:

 
$ echo "234432 12:44:22.432095 LATENCY blah CMDTYPE=NEW foo bar 123456789" | \ 
sed -n '/LATENCY/!b;/CMDTYPE=NEW/!b;s/^.\+\s\+\([0-9:.]\+\)\s.\+\(.........\)$/\1 \2/; p' 
12:44:22.432095 123456789 
9

cut debe hacer el trabajo

grep something somewhere | grep againsomething | cut -f2 -d' ' 
Cuestiones relacionadas