我的查询是提取双引号之间的值""
。输入示例为:
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
任何人有任何想法,请建议。
答案1
你可以只使用cut
为了这:
$cut -d '"' -f2 < logfile
GET /balancer-manager HTTP/1.1
-d '"'
告诉cut
使用双引号作为其字段分隔符。-f2
告诉它获取第二个字段,该字段位于第一个和第二个引号之间 - 或第一个带引号的字符串,正是您想要的。
答案2
一种使用方式awk
awk -F'"' '$0=$2' file
如果由于某种荒谬的原因你的 HTTP 方法实际上是0
并且你想输出这些
awk -F'"' '{$0=$2}1' file
答案3
您可以通过多种方式做到这一点。
和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
答案4
处理带引号的输入数字
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