Trích xuất giá trị giữa các dấu ngoặc kép


16

Truy vấn của tôi là để trích xuất giá trị giữa các dấu ngoặc kép "". Đầu vào mẫu là:

10.219.41.68 - - - [11 tháng 6 năm 2014: 10: 23: 04 -0400] Giây: 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 "

Tôi có tệp nhật ký lớn, do đó, các giá trị có thể thay đổi cho mỗi dòng, cần trích xuất giá trị giữa lần xuất hiện đầu tiên của dấu ngoặc kép.

Sản lượng dự kiến:

GET /balancer-manager HTTP/1.1

Bất cứ ai có ý tưởng sau đó xin vui lòng đề nghị.


Câu trả lời:


27

Bạn chỉ có thể sử dụng cutcho việc này:

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

-d '"'nói cutđể sử dụng một trích dẫn kép như dấu phân cách trường của nó. -f2yêu cầu nó lấy trường thứ hai, nằm giữa dấu ngoặc kép thứ nhất và thứ hai - hoặc chuỗi trích dẫn đầu tiên, chính xác là những gì bạn muốn.


Làm thế nào để in tất cả các cột được đánh số chẵn dễ dàng như thế %!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,58nào?
hhh

10

Một cách sử dụng awk

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

Nếu vì một lý do vô lý nào đó, các phương thức HTTP của bạn thực sự 0và bạn muốn xuất ra những

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

Điều gì nếu $2là null?
cuonglm

Sau đó, nó sẽ không in nó? Giống như nó sẽ không trong câu trả lời của bạn. Chỉ khác là câu trả lời của bạn sẽ in một dòng trống cho mỗi bản ghi không có $ 2.

Không, câu trả lời của tôi in một khoảng trống như thế. Và hãy tưởng tượng rằng giá trị là 0, không chỉ null?
cuonglm

Tôi tưởng tượng với bối cảnh của câu hỏi sẽ không có vấn đề gì.

Cảm ơn tất cả các phản hồi nhanh chóng của bạn ... Nó thực sự hữu ích cho tôi. Cảm ơn rất nhiều!
dùng79658

4

Vì một awkperlcác giải pháp đã được cung cấp, tôi muốn thử sed:

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

2

Bạn có thể làm điều đó bằng nhiều cách.

Với awk:

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

Với perl:

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

0

xử lý số đầu vào được trích dẫn

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

Hãy cố gắng tiết lộ hơn một chút trong câu trả lời của bạn
ddnomad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.