ด้วยsedคุณสามารถทำหน้าต่างบานเลื่อน
sed '1N;$!N;/141.299.99.1/P;D'
นั่นมัน แต่ระวังbashพฤติกรรมบ้าของการขยายตัว! แม้จะยกมา !!! ในสตริงคำสั่งจากประวัติคำสั่งของคุณอาจทำให้มันบ้าไปหน่อย นำหน้าคำสั่งด้วยset +H;หากคุณพบว่าเป็นกรณีนี้ หากต้องการเปิดใช้งานอีกครั้ง(แต่ทำไม ???)ทำในset -Hภายหลัง
ที่แน่นอนเท่านั้นจะใช้ถ้าคุณถูกใช้bash- แต่ผมไม่เชื่อว่าคุณเป็น ผมค่อนข้างมั่นใจคุณกำลังทำงานกับcsh- (ซึ่งเกิดขึ้นเป็นเปลือกที่มีพฤติกรรมบ้าbashemulates กับการขยายตัวประวัติศาสตร์ แต่อาจจะไม่สุดขั้วคเปลือกเอามัน) ดังนั้นอาจ\!ควรจะทำงาน ฉันหวังว่า.
มันเป็นโค้ดแบบพกพาทั้งหมด: POSIX อธิบายประกอบการสามดังนี้: (แม้ว่ามันจะเป็นที่น่าสังเกตว่าฉันได้รับการยืนยันเพียงคำอธิบายนี้มีอยู่เป็นช่วงต้น 2001)
[2addr]N
ผนวกอินพุตบรรทัดถัดไปโดยลด\newline ที่จะสิ้นสุดลงในพื้นที่รูปแบบโดยใช้\newline ในตัวเพื่อแยกวัสดุที่ต่อท้ายออกจากวัสดุดั้งเดิม โปรดทราบว่าการเปลี่ยนแปลงหมายเลขบรรทัดปัจจุบัน
[2addr]P
เขียนพื้นที่รูปแบบจนถึง\newline แรกไปยังเอาต์พุตมาตรฐาน
[2addr]D
ลบเซ็กเมนต์เริ่มต้นของพื้นที่รูปแบบผ่าน\newline แรกและเริ่มรอบถัดไป
ดังนั้นในบรรทัดแรกคุณเพิ่มบรรทัดพิเศษลงในพื้นที่รูปแบบดังนั้นจึงมีลักษณะดังนี้:
^line 1s contents\nline 2s contents$
จากนั้นในบรรทัดแรกและทุกบรรทัดหลังจากนั้น - ยกเว้นบรรทัดสุดท้าย - คุณเพิ่มอีกบรรทัดในพื้นที่รูปแบบ ดังนั้นดูเหมือนว่านี้:
^line 1\nline 2\nline 3$
หากพบที่อยู่ IP ของคุณภายในคุณPจะขึ้นบรรทัดใหม่เป็นครั้งแรกดังนั้นเพียงแค่บรรทัดที่ 1 ที่นี่ ในตอนท้ายของทุกรอบคุณจะได้พบDกันและเริ่มต้นใหม่ด้วยสิ่งที่เหลืออยู่ ดังนั้นรอบต่อไปดูเหมือนว่า:
^line 2\nline 3\nline 4$
... และต่อไป หากคุณพบไอพีของคุณจากหนึ่งในสามตัวที่เก่าแก่ที่สุดจะพิมพ์ออกมาทุกครั้ง ดังนั้นคุณจะอยู่ข้างหน้าเพียงสามบรรทัดเสมอ
นี่คือตัวอย่างรวดเร็ว ฉันจะได้รับบัฟเฟอร์บรรทัดที่สามพิมพ์สำหรับทุกหมายเลขลงท้ายด้วยศูนย์:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
คนนั้นซับซ้อนกว่าคุณเล็กน้อยเพราะฉันต้องสลับจากการขึ้น0\nบรรทัดใหม่หรือ0$จุดสิ้นสุดของรูปแบบเพื่อให้คล้ายกับปัญหาของคุณมากขึ้น - แต่พวกเขาแตกต่างกันอย่างละเอียดในเรื่องนี้ต้องใช้สมอ - ซึ่งอาจเป็นเรื่องยากที่จะทำตั้งแต่ รูปแบบพื้นที่เลื่อนอย่างต่อเนื่อง
ฉันใช้กรณีแปลก ๆ ของ 10 และ 52 เพื่อแสดงว่าตราบใดที่สมอเรือมีความยืดหยุ่นดังนั้นก็คือผลลัพธ์ อย่างเต็มที่พกพาฉันสามารถบรรลุผลลัพธ์เดียวกันโดยแทนที่จะนับอัลกอริทึมและทำ:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
และขยายการค้นหาในขณะที่ จำกัด หน้าต่างของฉัน - จาก 0 ถึง 9 และ 0 และจาก 3 บรรทัดเป็นสอง
อย่างไรก็ตามคุณได้รับความคิด