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.