二重引用符の間の値を抽出する


16

私のクエリは、二重引用符の間の値を抽出すること""です。サンプル入力は次のとおりです。

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

私は大きなログファイルを持っているので、値は行ごとに異なる可能性があり、二重引用符が最初に現れる間の値を抽出する必要があります…

期待される出力:

GET /balancer-manager HTTP/1.1

誰でも何かアイデアがあれば提案してください。


回答:


27

あなただけのためcutにこれを使用することができます:

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

-d '"'cutフィールド区切り文字として二重引用符を使用するように指示します。-f2最初の引用符と2番目の引用符の間にある2番目のフィールド、または最初に引用符で囲まれた文字列、必要なフィールドを取得するように指示します。


すべての偶数列をカットで簡単に印刷するにはどうすれば%!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

を使用する方法 awk

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

何らかの不合理な理由でHTTPメソッドが実際に0あり、これらを出力したい場合

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

$2nullの場合はどうなりますか?
クオンルム14

それからそれを印刷しませんか?それはあなたの答えで文句を言わないのと同じです。唯一の違いは、回答が$ 2なしですべてのレコードに空白行を出力することです。

いいえ、私の答えは空白のようなものを印刷します。そして、値が0nullだけでなくであると想像してください?
cuonglm 14

問題にならない質問のコンテキストが与えられたと想像します。

あなたの迅速な対応に感謝します...私にとって本当に助かります。どうもありがとう!
user79658 14

4

以来awkperlソリューションがすでに提供され、私が試してみたかったですsed

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

2

あなたは多くの方法でそれをすることができます。

awk

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

perl

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

0

引用された入力番号の処理

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

あなたの答えをもう少し冗長にしてみてください
ddnomad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.