Extrai valor entre aspas duplas

13

Minha consulta é extrair o valor entre aspas duplas "" . A entrada de amostra é:

10.219.41.68 - - - [11/Jun/2014:10:23:04 -0400] Sec:0 MicSec:1797 "GET /balancer-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"

Eu tenho arquivos de log grandes, portanto, os valores podem variar para cada linha. É necessário extrair o valor entre a primeira ocorrência de aspas duplas…

Resultado esperado:

GET /balancer-manager HTTP/1.1

Alguém tem alguma ideia, por favor sugira.

    
por user79658 04.08.2014 / 12:02

5 respostas

22

Você pode usar apenas cut para isso:

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

-d '"' diz a cut para usar aspas duplas como seu delimitador de campo. -f2 diz para ele pegar o segundo campo, que fica entre a primeira e a segunda aspas - ou a primeira string citada, exatamente o que você quer.

    
por 04.08.2014 / 12:05
10

Uma maneira de usar awk

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

Se por algum motivo absurdo seus métodos HTTP forem realmente 0 e você quiser gerar estes

awk -F'"' '{$0=$2}1' file
    
por 04.08.2014 / 12:14
4

Como as soluções awk e perl já foram fornecidas, tentei usar sed :

sed 's/[^"]*"\([^"]*\)".*//' file
    
por 06.08.2014 / 11:05
2

Você pode fazer isso de várias formas.

com awk :

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

com perl :

$ perl -F'"' -anle 'print $F[1]' file
GET /balancer-manager HTTP/1.1
    
por 04.08.2014 / 12:12
0

processando 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
    
por 12.06.2017 / 12:30

Tags