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.

user79658
la source
stackoverflow.com/questions/7804673/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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.

Michael Homer
la source
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
phk
la source
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
Srini
la source
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
cuonglm
la source
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
Un homme
la source
Essayez d'être un peu plus verbeux dans votre réponse
ddnomad