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.

pengguna79658
sumber
stackoverflow.com/questions/7804673/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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.

Michael Homer
sumber
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
phk
sumber
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
Srini
sumber
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
cuonglm
sumber
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
Seorang pria
sumber
Cobalah untuk sedikit lebih bertele-tele dalam jawaban Anda
ddnomad