ฉันสามารถ grep เฉพาะ n บรรทัดแรกของไฟล์ได้หรือไม่


คำตอบ:


176

ความมหัศจรรย์ของท่อ

head -10 log.txt | grep <whatever>

13
คุณยังสามารถต่อท่อสตรีมโดยพลการไปที่head:someCmd | head -10
Stuart Nelson

1
ค่าเริ่มต้นของส่วนหัวคือการพิมพ์ 10 บรรทัดแรกไปยังเอาต์พุตมาตรฐานดังนั้นจึงใช้ได้กับ 10 บรรทัดhead log.txt | grep <whatever>
Zlemini

5
มีวิธีดำเนินการเมื่อใช้-lตัวเลือกของ grep หรือไม่? ฉันต้องการแสดงรายการไฟล์ทั้งหมดว่าใครเป็น 5 ตัวRIFFDแรก
James M. Lay

49

สำหรับผู้ที่พบสิ่งนี้ใน Google ฉันจำเป็นต้องค้นหาnบรรทัดแรกของไฟล์หลายไฟล์ แต่ต้องพิมพ์เฉพาะชื่อไฟล์ที่ตรงกันเท่านั้น ฉันใช้

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfileหยุดการประมวลผลแฟ้มครั้งเดียว 10 คู่สายได้รับการเห็น //..{}พิมพ์ชื่อไฟล์และย้ายในเมื่อใดก็ตามที่การแข่งขันครั้งแรกในการแสดงได้รับไฟล์จะเพิ่มขึ้น หากต้องการอ้างชื่อไฟล์เพื่อประโยชน์ของโปรแกรมอื่นให้ใช้

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
ฉันเป็นหนึ่งในคนเหล่านั้นที่พบสิ่งนี้ใน Google ขอบคุณ!
Floris

สำหรับฉันรหัสนี้พิมพ์เส้นทางแบบเต็มของไฟล์ ซึ่งเป็นสิ่งที่ฉันต้องการ นอกจากนี้FNR=1จะค้นหาบรรทัดที่ 1 ขอบคุณ!
Brian W

2
หากต้องการทำสิ่งนี้ซ้ำ ๆ บนไดเรกทอรี:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
ขอบคุณ @OrangeDog การแก้ไขเล็กน้อย: ควรจะเป็น-type f
David Siegal

26

หรือใช้awkสำหรับกระบวนการเดียวโดยไม่ต้อง|:

awk '/your_regexp/ && NR < 11' INPUTFILE

ในแต่ละบรรทัดหากyour_regexpตรงกันและจำนวนของเร็กคอร์ด (บรรทัด) น้อยกว่า 11 จะรันแอ็คชันเริ่มต้น (ซึ่งเป็นการพิมพ์บรรทัดอินพุต)

หรือใช้sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

ตรวจสอบ regexp ของคุณและพิมพ์บรรทัด ( -nหมายถึงอย่าพิมพ์อินพุตซึ่งเป็นค่าเริ่มต้น) และออกจากบรรทัดที่ 10 ทันที


1
ทำไมไม่เลิกในวันที่ 10? (ดูวิธีแก้ปัญหา)
potong

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile- เร็วขึ้น

1
@potong คุณถูกต้องแก้ไข @srikanthradix ในขณะที่สามารถทำได้เร็วขึ้นคุณจะแก้ปัญหาไม่ได้ค้นหา regexps แต่สำหรับสตริงคงที่เท่านั้น awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileทำ.
Zsolt Botykai

4
awkishพลัสรูปแบบไม่ได้ 2xifsและ1xelseในคำสั่งที่ไม่จำเป็นต้องมีคำสั่งการดำเนินการใด ๆ จะทำให้ aho weinberger และ kernighan ร้องไห้ ...
jaypal singh

1
ฉันคิดว่าแทนที่จะใช้ NR จะดีกว่าถ้าใช้ FNR เพราะถ้าคุณใช้ awk กับไฟล์หลายไฟล์ FNR เริ่มจาก 0 สำหรับแต่ละไฟล์
Vladyslav Savchenko

9

grepคุณมีไม่กี่ตัวเลือกการใช้โปรแกรมพร้อมกับ วิธีที่ง่ายที่สุดในความคิดของฉันคือการใช้head:

head -n10 filename | grep ...

headออกจะ 10 บรรทัดแรก (โดยใช้-nตัวเลือก) grepและจากนั้นคุณสามารถท่อที่ส่งออกไปยัง


6
ฉันไม่ได้ตระหนักถึงการแก้ปัญหาทั้งหมดที่นี่ใช้headได้ใช้-n 10 (รวมทั้งผม)ไม่ทราบว่าheadโดยเริ่มต้นแสดงเพียง 10 เส้น :)
jaypal singh




3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: พิมพ์สองบรรทัดก่อนแบบ

-B 2: พิมพ์สองบรรทัดหลังรูปแบบ

head -10 log.txt # read the first 10 lines of the file.

1
ถ้าฉันจำได้-C 2จะทำเช่นเดียวกับ-A 2 -B 2
David LeBauer


2

ส่วนขยายของคำตอบของ Joachim Isaksson: บ่อยครั้งที่ฉันต้องการบางสิ่งจากตรงกลางของไฟล์ยาวเช่นบรรทัด 5001 ถึง 5020 ซึ่งในกรณีนี้คุณสามารถรวมheadกับtail:

head -5020 file.txt | tail -20 | grep x

สิ่งนี้จะได้รับ 5020 บรรทัดแรกจากนั้นแสดงเพียง 20 บรรทัดสุดท้ายจากนั้นต่อท่อทุกอย่างเป็น grep

(แก้ไข: ข้อผิดพลาด Fencepost ในหมายเลขตัวอย่างของฉันเพิ่มไปป์ใน grep)


1

grep -A 10 <รูปแบบ>

นี่คือการจับรูปแบบและ 10 บรรทัดถัดไปหลังจากรูปแบบ วิธีนี้จะใช้ได้ดีเฉพาะกับรูปแบบที่ทราบหากคุณไม่มีรูปแบบที่ทราบให้ใช้คำแนะนำ "head"


1
แม้ว่ามันอาจจะถูก เพิ่มคำอธิบายของคำถามเพื่อให้คำตอบครอบคลุมมากขึ้น
Pramod S. Nikam

3
สิ่งนี้ตอบคำถามที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและไม่มีประโยชน์ในบริบทนี้
Pre101

-1

ฉันมีปัญหาที่คล้ายกันและปัญหาทั้งหมดข้างต้นไม่สามารถแก้ไขได้ทั้งหมด ฉันยังสนใจที่จะรับชื่อไฟล์ที่มีบรรทัดที่ตรงกัน วิธีแก้ปัญหาของฉัน:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

หมายเหตุ: รูปแบบในกรณีของฉันจะตรงกับบรรทัดแรกเสมอ

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