提取双引号之间的值


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

任何人有任何想法,然后建议。


Answers:


27

您可以cut为此使用:

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

-d '"'告诉cut使用双引号作为其字段定界符。-f2告诉它接受第二个字段,该字段恰好是您想要的,该字段位于第一和第二个引号之间或第一个带引号的字符串之间。


如何轻松地像剪切一样打印所有偶数列%!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

如果$2为空怎么办?
cuonglm

那它不会打印吗?与您的答案相同。唯一的不同是您的答案将为每条没有$ 2的记录打印空白行。

不,我的答案打印为空白。并假设该值为0,不仅为null?
cuonglm

我想在给出问题的上下文的情况下这不是问题。

感谢大家的快速反应...对我真的很有帮助。非常感谢!
user79658 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.