awk
ฉันต้องการที่จะดึงเส้นบางด้วย เป็นไปได้หรือไม่ที่จะทำภารกิจต่อไปนี้:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
ฉันจะแสดงรายละเอียดจากหมายเลขบรรทัด 122 ถึง 129 ได้อย่างไร
awk
ฉันต้องการที่จะดึงเส้นบางด้วย เป็นไปได้หรือไม่ที่จะทำภารกิจต่อไปนี้:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
ฉันจะแสดงรายละเอียดจากหมายเลขบรรทัด 122 ถึง 129 ได้อย่างไร
คำตอบ:
คุณยังไม่เข้าใจวิธีการawk
ทำงาน "โปรแกรม" ที่ระบุจะถูกดำเนินการหนึ่งครั้งสำหรับแต่ละบรรทัด (หรือ "บันทึก" ใน awk parlance) ของอินพุตโดยไม่จำเป็นต้องมีFOR
หรือโครงสร้างที่คล้ายกันใด ๆ เพียงใช้:
วิธีการ verbose
ls -l | awk 'NR>=122 && NR<=129 { print }'
วิธีการกระชับมากขึ้น
ls -l | awk 'NR==122,NR==129'
สิ่งหนึ่งที่ให้ช่วงNR
ซึ่งเป็น "บันทึกหมายเลข" โดยทั่วไปนี่คือบรรทัดปัจจุบันawk
กำลังประมวลผล
awk
ls -l | awk 'NR==122,NR==129'
อีกวิธีหนึ่งจะใช้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
อีกวิธีในการทำเช่นนี้ (แม้ว่าฉันชอบawk
วิธีการ) โดยใช้ coreutils:
ls -l | tail -n +122 | head -n 8
sed
วิธีการตั้งแต่sed
เพื่อให้มีขนาดเล็กมากawk
(และโหลดได้เร็วกว่า)