วิธีรัน awk สำหรับจำนวนบรรทัดบางบรรทัด?


18

awkฉันต้องการที่จะดึงเส้นบางด้วย เป็นไปได้หรือไม่ที่จะทำภารกิจต่อไปนี้:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

ฉันจะแสดงรายละเอียดจากหมายเลขบรรทัด 122 ถึง 129 ได้อย่างไร


หากคุณกำลังจะทำเช่นนี้ในวงผมขอแนะนำsedวิธีการตั้งแต่sedเพื่อให้มีขนาดเล็กมาก awk(และโหลดได้เร็วกว่า)
zrajm

คำตอบ:


36

คุณยังไม่เข้าใจวิธีการawkทำงาน "โปรแกรม" ที่ระบุจะถูกดำเนินการหนึ่งครั้งสำหรับแต่ละบรรทัด (หรือ "บันทึก" ใน awk parlance) ของอินพุตโดยไม่จำเป็นต้องมีFORหรือโครงสร้างที่คล้ายกันใด ๆ เพียงใช้:

วิธีการ verbose

ls -l | awk 'NR>=122 && NR<=129 { print }'

วิธีการกระชับมากขึ้น

ls -l | awk 'NR==122,NR==129'

สิ่งหนึ่งที่ให้ช่วงNRซึ่งเป็น "บันทึกหมายเลข" โดยทั่วไปนี่คือบรรทัดปัจจุบันawkกำลังประมวลผล


6
ที่จริงโดยทั่วไปสำหรับงานดังกล่าวเป็นเรื่องปกติawk ls -l | awk 'NR==122,NR==129'
จัดการ

คำสั่งสำหรับรับ 100 บรรทัดสุดท้ายจากไฟล์โดยใช้ awk
อะไร

8

อีกวิธีหนึ่งจะใช้sed:

ls -l | sed -ne '122,129p'

แต่ถ้าหากคำถามของคุณเป็นสิ่งสำคัญที่จะต้องใช้ awk สำหรับสิ่งนี้ไปกับความเห็นของ manatwork ต่อคำตอบของ Zrajm ในฐานะที่เป็นเอกสารประกอบของ awk:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

ดังนั้นหากคุณต้องการคุณสามารถสร้างเงื่อนไขขั้นสูงเพิ่มเติมได้ ตัวอย่างเช่น:

ls -l | awk 'NR==122,/foobar/'

สิ่งนี้จะเริ่มเอาต์พุตที่บรรทัดที่ 122 และดำเนินการต่อไปจนกระทั่งบรรทัดมีคำว่า "foobar"

หากคุณบอกเราถึงกรณีการใช้งานจริงเราอาจสามารถช่วยเหลือคำตอบที่ให้ทางออกที่ดีกว่า ฉันกังวลว่าเสียงนี้ชอบปัญหา XY


2

อีกวิธีในการทำเช่นนี้ (แม้ว่าฉันชอบawkวิธีการ) โดยใช้ coreutils:

ls -l | tail -n +122 | head -n 8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.