ฉันจะ จำกัด จำนวนผลลัพธ์ที่ส่งคืนจาก grep ได้อย่างไร


180

ฉันต้องการพูดสูงสุด 10 บรรทัดจาก grep

ฉันไม่ต้องการให้คอมพิวเตอร์ทำงานหนัก ฉันต้องการให้มันหยุดหลังจาก 10 ผลลัพธ์ที่พบโดย grep เป็นไปได้ไหม?


ในกรณีของคุณคุณไม่ต้องการให้คอมพิวเตอร์ทำงานหนัก .. แต่ถ้าเป็นปัญหาการอ่านของมนุษย์คุณสามารถใช้lessผ่านทางท่อได้ ซึ่งจะเต็มหน้าจอและคุณสามารถกด ENTER เพื่อดูบรรทัดเพิ่มเติมและqเพื่อออกจาก:grep "SomeText" somefile.csv | less
SilentSteel

คำตอบ:


240

-mตัวเลือกอาจเป็นสิ่งที่คุณกำลังมองหา:

grep -m 10 PATTERN [FILE]

จากman grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

หมายเหตุ: grep หยุดอ่านไฟล์เมื่อพบจำนวนการแข่งขันที่ระบุ!


3
สวัสดีมันลองใช้งานได้โดยทั่วไป แต่ดูเหมือนว่า grep "หยุด" คิดหลังจากที่เขาพบว่า 10 บรรทัดแรกดูเหมือนว่าเขายังคงคิดและ "ใช้ซีพียูของฉัน" และไม่พิมพ์มันเป็นสิ่งที่ถูกต้องหรือไม่ thansk
Jas

6
@ Jason: ดูเหมือนจะไม่เป็นเช่นนั้น: grep ใช้เวลา 0.005 วินาที-m 1และ 1.579 วินาทีโดยไม่ใช้ไฟล์ที่มี 10 ล้านบรรทัดบนแล็ปท็อปของฉัน
Grégoire

3
tailโดยทั่วไปการเข้าไปในท่อจะใช้งานได้ แต่โดยเฉพาะอย่างยิ่งถ้าคุณโลภบริบทgrep -A10 PATTERNโดยใช้การtailตัดทอนบริบทแทนที่จะใช้จำนวนผลลัพธ์ คำตอบนี้คือสิ่งที่ฉันกำลังมองหา
dimo414

1
-m 10เป็นตัวเลือกที่สร้างความแตกต่างเมื่อ grepping ไฟล์หลายไฟล์! การไปป์ที่หัวจะไม่แสดงรายการที่ตรงกันในไฟล์ที่ตามมาหากมีรายการที่ตรงกันมากเกินไปในไฟล์แรก ขอบคุณมาก!
Julien

1
IMHO ควรทำเครื่องหมายเป็นคำตอบที่ยอมรับเนื่องจากไม่ต้องการเครื่องมืออื่น BTW มันง่ายกว่าที่จะจำตัวเลือกนี้เมื่อรู้ว่ามันเป็นทางลัดของ - max-count
ishahak

68

อีกทางเลือกหนึ่งคือใช้หัว :

grep ...parameters... yourfile | head

สิ่งนี้จะไม่ต้องการค้นหาไฟล์ทั้งหมด - มันจะหยุดเมื่อพบบรรทัดที่ตรงกันสิบบรรทัดแรก ข้อดีอีกประการของวิธีนี้คือจะส่งคืนไม่เกิน 10 บรรทัดแม้ว่าคุณจะใช้ grep พร้อมกับตัวเลือก -o

ตัวอย่างเช่นหากไฟล์มีบรรทัดต่อไปนี้:

112233
223344
123123

ดังนั้นนี่คือความแตกต่างในผลลัพธ์:

$ grep -o '1. ' yourfile | หัว -n2
11
12

$ grep -m2 -o '1. '
11
12
12

การใช้headผลตอบแทนเพียง 2 ผลลัพธ์ตามที่ต้องการในขณะที่ -m2 กลับ 3


3
โปรดทราบว่าคุณไม่สามารถใช้| headไพพ์เมื่อใช้grepกับ-Aหรือ-B(และดังนั้นไม่เพียง แต่ค้นหาผลลัพธ์ ( -o) แต่ใช้บริบทเช่นกัน) ในกรณีนั้นคุณจะเหลือ-mเพื่อบอก grep จำนวนบรรทัดพร้อมผลลัพธ์ที่จะส่งคืน
อัตติลาโอ.

17
การใช้ส่วนหัวไม่ได้เป็นการหยุด grep จากการทำงานผ่านไฟล์ทั้งหมด การใช้ตัวเลือก -m ใน grep ทำ
LopSae


0

ใช้หาง:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 

คุณสามารถตั้งค่าใน "การจัดรูปแบบรหัส" โดยคลิกที่ไอคอนเช่น "{}" ในเครื่องมือแก้ไข
peterh - Reinstate Monica

มันจะมีประโยชน์ที่จะให้ตัวอย่างที่อ่านได้มากกว่า loooonl loooog liiines
Putnik

0

สำหรับ 2 กรณีใช้:

  1. ฉันต้องการเฉพาะผลลัพธ์โดยรวมเท่านั้นไม่ใช่ผลลัพธ์ต่อไฟล์ grep -m 2จะเกิดขึ้นต่อไฟล์สูงสุด
  2. ฉันมักจะใช้git grepที่ไม่ใช้-m

ทางเลือกที่ดีในสถานการณ์เหล่านี้คือgrep | sed 2qการ grep 2 รายการแรกในไฟล์ทั้งหมด เอกสาร sed: https://www.gnu.org/software/sed/manual/sed.html

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