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.

usuario79658
fuente
stackoverflow.com/questions/7804673/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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.

Michael Homer
fuente
¿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
phk
fuente
¿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
Srini
fuente
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
Cuonglm
fuente
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
Un hombre
fuente
Intenta ser un poco más detallado en tu respuesta
ddnomad