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.