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.

user79658
fonte

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.

Michael Homer
fonte
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
phk
fonte
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
Srini
fonte
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
cuonglm
fonte
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
Um homem
fonte
Tente ser um pouco mais detalhado em sua resposta
ddnomad