พิมพ์บรรทัดที่เฉพาะเจาะจงและอื่น ๆ อีกมากมาย


1

ฉันพยายามค้นหาไฟล์เพื่อหาแพทเทิร์นและถ้าพบมันฉันต้องการเห็นบรรทัดและผลลัพธ์อีก 10 บรรทัด

จนถึงตอนนี้ฉันมี

grep -n pattern file | cut -d: f1 

ตอนนี้ไม่แน่ใจว่าจะใช้สิ่งนี้ออกไปทำพิมพ์ด้วยตรรกะเช่น

sed -n result,(result+10)p file

อาจจะมีจำนวนเล็กน้อยที่ออกหากรูปแบบอยู่ในหลายบรรทัด

ความช่วยเหลือใด ๆ ที่ชื่นชม

linux  bash  unix 

คำตอบ:


0

ถ้า grep -A ไม่ทำงานลอง

awk '/pattern/ {for(i=0;i<number_of_lines;i++){print;getline}}' <filename>

sed อื่นมีวิธีการแก้ปัญหาที่สกปรกอีก

sed -n '/pattern/ {p;n;p;n;p;...}' <filename> ที่นี่ p- & gt; พิมพ์, n - & gt; ไปที่บรรทัดถัดไป ดังนั้น number of คือจำนวนบรรทัดที่จะพิมพ์

ปรับปรุง:

เพื่อใช้เป็นฟังก์ชั่นเขียนใน test.sh

jobcheck(){
  awk "/$1/"' {for(i=0;i<10;i++){print;getline}}' $2
}

เพียงแค่นั้น

source test.sh

วิ่ง,

jobcheck "pattern" "file"

ปรับปรุง: ตามคำแนะนำของ Jonathan Leffler หากหนึ่งใน 10 บรรทัดถัดไปมีรูปแบบการนับควรเริ่มจากบรรทัดนั้น

pattern  ->start printing from here to next 10 lines
blah
blah
pattern  ->forget about the last 2 lines, start counting from here
blah 
blah

คำสั่ง awk ที่อัปเดตแล้วจะเป็นเช่นนั้น

awk '/pattern/{max_line=NR+2} {if(NR<=max_line) print}' <filename>

ภายใน Jobcheck ก็จะถูกเปลี่ยนเช่นกัน ไชโย :)


เยี่ยมยอดฉันจะทำให้ฟังก์ชั่นนี้เป็นอย่างไร: jobcheck () {awk '/ $ 1 / {สำหรับ (i = 0; i & lt; 10; i ++) {print; getline}}' $ 2}

ฉันอัปเดตคำตอบสำหรับสิ่งนั้น :)

โปรดทราบว่าหากรูปแบบปรากฏใน 10 บรรทัดถัดไปคุณควร (อาจ) ตั้งค่าใหม่ 'ตัวนับการพิมพ์' หรือออกแบบเพื่อให้คุณพบคู่ที่ตรงกันคุณตั้งค่า max_print = NR + 10; แล้วสำหรับแต่ละบรรทัด if (NR < max_print) print
Jonathan Leffler

ใช่นั่นเป็นข้อเสนอแนะที่ดีปรับปรุงคำตอบ :)

อืมฉันใส่ฟังก์ชั่นนี้ใน ~ / .bashrc ของฉันเพราะมันสั้น แต่ฉันมีข้อผิดพลาดที่บอกว่าข้อผิดพลาดทางไวยากรณ์: จุดสิ้นสุดของไฟล์ที่ไม่คาดคิด ฉันไม่ได้ใส่ฟังก์ชั่นในตอนท้ายของไฟล์ คุณรู้ว่าสิ่งที่อาจเป็นปัญหาหรือไม่

2

ใช้ grep 2.10:

grep -A 10 "pattern" your_file

จะพิมพ์ 10 บรรทัดหลังการแข่งขัน

จาก grep man page :

- จำนวน

--after บริบท = NUM

พิมพ์บรรทัด num ของบริบทการติดตามหลังจากการจับคู่บรรทัด

ใช้ GNU awk 3.1.8:

awk '{if(a-->0) {print; next}} /pattern/{print; a=10}' your_file

มันบอกว่าตัวเลือกที่ผิดกฎหมายสำหรับฉัน ฉันทุบตี 3.0.19 ฉันเชื่อ

grep เวอร์ชันของคุณเป็นข้อมูลที่สำคัญ grep -V
Fred Thomsen

จ้ะแม้นั่นเป็นตัวเลือกที่ผิดกฎหมาย ฉันคิดว่าสิ่งที่ฉันล้าสมัยจริง ๆ ?

@yatici อัปเดตด้วย awk เข้าใกล้
Alex

คุณอาจกำลังใช้ grep รุ่นที่ตัดทอนลง หากคุณใช้การกระจายแบบ RPM คุณสามารถทำได้ rpm -ql grep หรือในการแจกแจงแบบ DEB dpkg -l grep เพื่อรับรุ่น
Wodin

0

ฉันต้องการใช้:

sed -n '/pattern/{N;N;N;N;N;N;N;N;N;N;p;}'

หรือ

sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.