คำสั่ง Linux และทักษะเชลล์
awk: เมื่อคอลัมน์กลายเป็นโปรแกรม
awk คือสิ่งที่คุณเข้าถึงเมื่อคอลัมน์กลายเป็นหน่วยของงาน: บันทึกการเข้าถึง nginx, /etc/passwd, เอาต์พุต df, สิ่งใดก็ตามที่อยู่ในฟิลด์ มันเป็นภาษาที่สมบูรณ์ (ตัวแปร อาร์เรย์ เลขคณิต กฎการกระทำของรูปแบบ) โดยสวมเสื้อผ้าชั้นเดียว ซึ่งเป็นการอำพรางที่เหมาะสมสำหรับบันทึกนิติเวช ขอบเขตที่ซื่อสัตย์: อะไรก็ตามที่ awk ทำได้อย่างสบายๆ ก็คือ one-liner และอะไรก็ตามที่จำเป็นต้องมีหน้าของบล็อกก็คือสคริปต์ Python ที่ยังไม่ยอมรับในตัวเอง
ประเด็นสำคัญ
- การแยกฟิลด์เป็นเคล็ดลับหลัก: awk -F: '$3 >= 1000 {print $1}' /etc/passwd แสดงรายการผู้ใช้จริง และ -F'[,|]' จัดการตัวคั่นหลายอักขระเมื่อการตัดถูกยกเลิกไปแล้ว
- นับด้วยอาร์เรย์เชื่อมโยง: awk '{count[$1]++} END {for (c in count) print count[c], c}' /var/log/secure เปลี่ยนบันทึกใด ๆ ให้เป็นตารางความถี่ในหนึ่งบรรทัด
- NR และ NF ตอบคำถามเกี่ยวกับไฟล์: 'NR==1' เป็นบรรทัดส่วนหัว '{print NF}' นับคอลัมน์ต่อแถว และการเปรียบเทียบ NR กับค่าที่บันทึกไว้ของไฟล์อื่นจะค้นหารายการซ้ำและช่องว่าง
- Match plus extract คือขนมปังรายวัน: awk '/ 500 / {print $7, $9}' access.log จะดึงหน้าข้อผิดพลาดที่มี URL และ OFS ให้คุณพิมพ์ $0 ใหม่หลังจากแก้ไขฟิลด์เดียวโดยไม่ต้องเขียนบรรทัดใหม่ด้วยตนเอง
- บล็อก BEGIN และ END เป็นที่ที่รวมการทำงาน: BEGIN ตั้งค่าตัวคั่น กฎกลางทำงานต่อบรรทัด END พิมพ์ผลรวม; สามช่วงตึกอ่านได้ปกติ ห้าช่วงตึกเป็นสคริปต์ที่สวมชุดปลอมตัว
- การอ้างถึงเป็นศัตรูที่แท้จริงของเชลล์วันไลน์เนอร์: การใส่เครื่องหมายคำพูดเดี่ยวของโปรแกรม การใช้เครื่องหมายคำพูดคู่อยู่ข้างใน และจำไว้ว่า $7 ในสตริงของเชลล์ที่มีเครื่องหมายคำพูดคู่นั้นไม่เคยถึง awk เลย
- งานตัวเลขได้รับ LC_ALL=C: เครื่องหมายจุลภาคของสถานที่เป็นตัวเลขและการจัดเรียงคี่จะทำให้การเปรียบเทียบและเรียงลำดับไปด้านข้าง และการปักหมุดสถานที่นั้นเป็นหนึ่งบรรทัดที่ช่วยประหยัดเวลาช่วงบ่าย
- รู้จักเพดาน: เครื่องหมายจุลภาคใน CSV, JSON ที่ซ้อนกัน หรือรูปแบบหลายบรรทัดแบบมีสถานะไปที่ Python awk เป็นมีดผ่าตัดและยังคงเป็นหนึ่งเดียว
บันทึกจากหน้างาน
บรรทัดเดียวที่น่าอึดอัดใจซึ่งสรุปคอลัมน์ดอลลาร์จากบันทึกที่มีเครื่องหมายจุลภาคระบุตำแหน่งทำให้เกิดตัวเลขที่ไม่มีใครสงสัยจนกว่าฝ่ายบัญชีจะเปิดรายงาน LC_ALL=C ย้ายไปยังไลบรารีนามแฝงของเราในสัปดาห์นั้นและยังคงอยู่
คำถามที่พบบ่อย
awk หรือตัดสำหรับงานคอลัมน์?
ตัดสำหรับตัวคั่นคงที่ตัวเดียวและรายการคอลัมน์ธรรมดา อย่างไรก็ตาม เงื่อนไขของโมเมนต์ regex เลขคณิต หรือผลรวมปรากฏขึ้น ซึ่งจุดนั้นการตัดนั้นอยู่นอกความลึกของมันอยู่แล้ว
ฉันจะหาผลรวมหรือเฉลี่ยคอลัมน์ได้อย่างไร
รวมใน END: awk '{s += $5} END {print s, s/NR}' เพิ่มและเฉลี่ยฟิลด์ห้าข้ามบรรทัด; ให้ดึงตัวคั่นหลักพันออกก่อนหากสถานที่ใส่เครื่องหมายจุลภาคลงในตัวเลข
เหตุใด awk one-liner ของฉันจึงมีพฤติกรรมแตกต่างออกไปบน macOS
macOS จัดส่ง POSIX awk โดยไม่มีส่วนขยาย GNU เช่น -i inplace หรือ gensub สคริปต์ที่ทำงานบน Linux อาจล้มเหลวอย่างเงียบๆ ที่นั่นได้ ดังนั้นควรเก็บสคริปต์ POSIX ไว้ในบรรทัดเดียวหรือพกอุกกาบาตติดตัวไปด้วย
awk สามารถแยกวิเคราะห์ JSON ได้หรือไม่
ไม่มีความหมาย: JSON ไม่มีโครงสร้างคอลัมน์ที่ awk เข้าใจและการแฮ็ก regex ทำลายวัตถุที่ซ้อนกัน ใช้ jq ซึ่งเป็นรูปร่างของ awk สำหรับ JSON หรือโมดูล json ของ Python เมื่องานเติบโตขึ้น
Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร
เราเคยรับเรื่องแบบนี้มาเป็นร้อยครั้ง: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน กับ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ คุณได้วงจรครบ ตั้งแต่เราประเมิน ลงมือทำ เฝ้าดูตลอดเวลา และรับเรื่องภายใน 30 นาทีเมื่อจำเป็น