Ekstrak nilai antara tanda kutip ganda


16

Permintaan saya adalah untuk mengekstraksi nilai antara tanda kutip ganda "". Input sampel adalah:

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 "

Saya memiliki file log besar, sehingga nilai dapat bervariasi untuk setiap baris, perlu mengekstrak nilai antara kemunculan tanda kutip ganda…

Output yang diharapkan:

GET /balancer-manager HTTP/1.1

Ada yang punya ide maka silakan sarankan.


Jawaban:


27

Anda bisa menggunakannya cutuntuk ini:

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

-d '"'memberitahu cutuntuk menggunakan kutipan ganda sebagai pembatas bidangnya. -f2memintanya untuk mengambil bidang kedua, yaitu antara kutipan pertama dan kedua - atau string yang dikutip pertama, persis apa yang Anda inginkan.


Bagaimana cara mencetak semua kolom bernomor genap dengan mudah %!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

Cara menggunakan awk

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

Jika karena alasan yang tidak masuk akal, metode HTTP Anda sebenarnya 0dan Anda ingin menampilkannya

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

Bagaimana jika $2itu nol?
— cuonglm

Maka tidak akan mencetaknya? Sama seperti itu tidak akan ada dalam jawaban Anda. Satu-satunya perbedaan adalah jawaban Anda akan mencetak baris kosong untuk setiap catatan tanpa $ 2.

Tidak, jawaban saya cetak seperti kosong. Dan bayangkan nilainya 0, bukan hanya nol?
— cuonglm

Saya membayangkan mengingat konteks pertanyaan yang tidak akan menjadi masalah.

Terima kasih atas tanggapan cepat Anda ... Ini sangat membantu saya. Terima kasih banyak!
— user79658

4

Karena sebuah awkdan perlsolusi sudah disediakan, saya ingin mencoba sed:

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

2

Anda bisa melakukannya dengan banyak cara.

Dengan awk:

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

Dengan perl:

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

0

memproses angka input yang dikutip

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

Cobalah untuk sedikit lebih bertele-tele dalam jawaban Anda
— ddnomad
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.