Extrair valor entre aspas duplas


16

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 / gerenciador de balanceamento 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, preciso extrair o valor entre a primeira ocorrência de aspas duplas…

Saída esperada:

GET /balancer-manager HTTP/1.1

Alguém tem alguma idéia, então por favor sugerir.


Respostas:


27

Você pode apenas usar cutpara isso:

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

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


Como imprimir todas as colunas numeradas pares é fácil de cortar %!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

Uma maneira de usar awk

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

Se, por algum motivo absurdo, seus métodos HTTP forem realmente 0e você deseja gerar esses

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

E se $2for nulo?
precisa saber é o seguinte

Então não vai imprimi-lo? O mesmo que na sua resposta. A única diferença é que sua resposta imprimirá uma linha em branco para cada registro sem US $ 2.

Não, minha resposta imprime um espaço em branco. E imagine que o valor seja 0não apenas nulo?
precisa saber é o seguinte

Eu imagino dado o contexto da pergunta que não seria um problema.

Obrigado a todos por suas respostas rápidas ... É realmente útil para mim. Muito obrigado!
user79658

4

Como já foram fornecidas soluções awke perl, eu queria tentar sed:

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

2

Você pode fazer isso de várias maneiras.

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

0

processamento 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

Tente ser um pouco mais detalhado em sua resposta
ddnomad
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.