แยกค่าระหว่างเครื่องหมายคำพูดคู่


16

""แบบสอบถามของฉันคือการดึงค่าระหว่างคำพูดคู่ ตัวอย่างอินพุตคือ:

10.219.41.68 - - - [11 / Jun / 2014: 10: 23: 04 -0400] วินาที: 0 MicSec: 1797 "GET / balancer-manager HTTP / 1.1" 200 28980 "-" "ขด / 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

ใครมีความคิดเห็นกรุณาแนะนำ


คำตอบ:


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ไม่เพียงเป็นโมฆะเท่านั้น?
cuonglm

ฉันจินตนาการถึงบริบทของคำถามที่ไม่เป็นปัญหา

ขอบคุณสำหรับการตอบกลับอย่างรวดเร็วของคุณ ... มันมีประโยชน์มากสำหรับฉัน ขอบคุณมาก!
user79658

4

เนื่องจากมีบริการawkและperlวิธีแก้ปัญหาอยู่แล้วฉันต้องการลอง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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.