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.