Extraire la valeur entre guillemets doubles


16

Ma requête consiste à extraire la valeur entre guillemets doubles "". L'échantillon d'entrée est:

10.219.41.68 - - - [11 / juin / 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 "

J'ai de gros fichiers journaux, donc les valeurs peuvent varier pour chaque ligne, j'ai besoin d'extraire la valeur entre la première occurrence de guillemets doubles…

Production attendue:

GET /balancer-manager HTTP/1.1

N'importe qui a une idée, veuillez suggérer.


Réponses:


27

Vous pouvez simplement utiliser cutpour cela:

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

-d '"'indique cutd'utiliser un guillemet double comme délimiteur de champ. -f2lui indique de prendre le deuxième champ, qui est entre les premier et deuxième guillemets - ou la première chaîne entre guillemets, exactement ce que vous voulez.


Comment imprimer facilement toutes les colonnes numérotées paires %!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

Une façon d'utiliser awk

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

Si, pour une raison absurde, vos méthodes HTTP sont réellement 0et que vous souhaitez les afficher

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

Et si $2est nul?
— cuonglm

Alors il ne l'imprimera pas? De la même manière que dans votre réponse. La seule différence est que votre réponse imprimera une ligne vierge pour chaque enregistrement sans 2 $.

Non, ma réponse imprime un blanc comme. Et imaginez que la valeur est 0non seulement nulle?
— cuonglm

J'imagine que compte tenu du contexte de la question, ce ne serait pas un problème.

Merci à tous pour vos réponses rapides ... C'est vraiment utile pour moi. Merci beaucoup!
— user79658

4

Puisqu'une awket des perlsolutions sont déjà fournies, je voulais essayer sed:

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

2

Vous pouvez le faire de plusieurs façons.

Avec awk:

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

Avec perl:

$ perl -F'"' -anle 'print $F[1]' file
GET /balancer-manager HTTP/1.1

0

traitement des numéros d'entrée cités

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

Essayez d'être un peu plus verbeux dans votre réponse
— ddnomad
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.