Extraer valor entre comillas dobles


16

Mi consulta es extraer el valor entre comillas dobles "". La entrada de muestra es:

10.219.41.68 - - - [11 / Jun / 2014: 10: 23: 04 -0400] Sec: 0 MicSec: 1797 "GET / balancencer-manager HTTP / 1.1" 200 28980 "-" "curl / 7.15.5 (i386 -redhat-linux-gnu) libcurl / 7.15.5 OpenSSL / 0.9.8b zlib / 1.2.3 libidn / 0.6.5 "

Tengo archivos de registro grandes, por lo que los valores pueden variar para cada línea, necesito extraer el valor entre la primera aparición de comillas dobles ...

Rendimiento esperado:

GET /balancer-manager HTTP/1.1

Alguien tiene alguna idea, por favor sugiérale.


Respuestas:


27

Puedes usar cutpara esto:

$cut -d '"' -f2 < logfile
GET /balancer-manager HTTP/1.1

-d '"'le dice cutque use una comilla doble como delimitador de campo. -f2le dice que tome el segundo campo, que está entre la primera y la segunda cita, o la primera cadena entre comillas, exactamente lo que desea.


¿Cómo imprimir todas las columnas numeradas pares en corte fácilmente como %!cut -d '"' -f2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58?
— hhh

10

Una forma de usar awk

awk -F'"' '$0=$2' file

Si por alguna razón absurda sus métodos HTTP son en realidad 0y desea generar estos

awk -F'"' '{$0=$2}1' file

¿Qué pasa si $2es nulo?
— Cuonglm

¿Entonces no lo imprimirá? Lo mismo que no será en su respuesta. La única diferencia es que su respuesta imprimirá una línea en blanco para cada registro sin $ 2.

No, mi respuesta imprime un espacio en blanco como. ¿E imagina que el valor es 0, no solo nulo?
— Cuonglm

Me imagino que dado el contexto de la pregunta, eso no sería un problema.

Gracias a todos por sus respuestas rápidas ... Es realmente útil para mí. ¡Muchas gracias!
— user79658

4

Como ya se proporcionan soluciones awky perl, quería probar sed:

sed 's/[^"]*"\([^"]*\)".*/\1/' file

2

Puedes hacerlo de muchas maneras.

Con awk:

$ awk -F'"' '{print $2}' file
GET /balancer-manager HTTP/1.1

Con perl:

$ perl -F'"' -anle 'print $F[1]' file
GET /balancer-manager HTTP/1.1

0

procesamiento de números de entrada citados

echo   1234   | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # no problem
echo '"1234"' | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # does not work
echo '"1234"' | awk '{ gsub("\"",""); i = $1         ;  printf( "%s %d\n",$1, i)}'  # works

Intenta ser un poco más detallado en tu respuesta
— ddnomad
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.