ฉันจะ grep 50 บรรทัดแรกของแต่ละไฟล์ในไดเรกทอรีซ้ำได้อย่างไร


10

ฉันต้องการค้นหา 50 บรรทัดแรกของทุกไฟล์ในไดเรกทอรีและไดเรกทอรีย่อย

นี่จะทำหน้าที่วนซ้ำ แต่ฉันจะ จำกัด แค่ 50 บรรทัดแรกของแต่ละไฟล์ได้อย่างไร

grep -r "matching string here" .

ไฟล์เหล่านี้บางไฟล์มีขนาดใหญ่มากและฉันต้องการให้ตรงกันใน 50 บรรทัดแรกเท่านั้น ฉันพยายามเร่งกระบวนการโดยไม่ค้นหาเมกะไบต์ของข้อมูลไบนารีในบางไฟล์


คุณต้องการที่จะรู้ว่าไฟล์ที่ตรงกับหรือคุณต้องการที่จะมีเพียงแค่สตริงการจับคู่หรือคุณต้องการสตริงการจับคู่พร้อมกับชื่อไฟล์?
gniourf_gniourf

คำตอบ:


11
  • หากคุณต้องการไฟล์ที่ตรงกับ:

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1")' _ {} \; -printf '%p\n'
    

    หรือ

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1") && printf '%s\n' "$1"' _ {} \;
    
  • หากคุณต้องการสตริงที่ตรงกันเท่านั้น:

    find . -type f -exec head -n 50 {} \; | grep "matching string here"
    

    หรือดีกว่า,

    find . -type f -exec head -q -n 50 {} + | grep "matching string here"
    
  • และถ้าคุณต้องการทั้ง:

    find . -type f -exec bash -c 'mapfile -t a < <(head -n 50 "$1" | grep "matching string here"); printf "$1: %s\n" "${a[@]}"' _ {} \;
    

หมายเหตุ.

  • อาจจะง่ายขึ้นเล็กน้อยกับsedแทนคำสั่งผสม-headgrep
  • ฉันขอเน้นว่าวิธีทั้งสามนั้นปลอดภัย 100% เกี่ยวกับชื่อไฟล์ที่อาจมีสัญลักษณ์ตลก (ช่องว่างบรรทัดใหม่ ฯลฯ )
  • ในสองวิธีนี้ฉันสมมติว่าคุณมี bash รุ่นล่าสุดอย่างเหมาะสม
  • คุณสามารถใช้-exec ... +ในแต่ละวิธีได้ แต่จากนั้นคุณจะต้องเขียนรหัสวนรอบภายในของคุณเอง! (แบบฝึกหัดเล็กน้อยจากซ้ายไปยังผู้อ่าน) สิ่งนี้อาจมีประสิทธิภาพมากกว่านี้เล็กน้อยหากคุณมีไฟล์ gazillion

4

หากคุณต้องการเอาต์พุต grep เหมือนเดิมคุณสามารถทำได้:

find . -type f | while read f; do 
  if head -n 50 "$f"|grep -s "matching string here"; then
    grep "matching string here" "$f" /dev/null 
  fi
done

หากคุณจำเป็นต้องใช้เพียงชื่อไฟล์ที่คุณสามารถแทนที่ grep ที่ 2 echo "$f"ด้วย


1

คุณจะต้องรวมยูทิลิตี้ต่าง ๆ เข้าด้วยกันเพื่อให้ได้ฟังก์ชั่นที่ต้องการ ใช้findคำสั่งเพื่อเรียกคืนไดเร็กทอรีค้นหาไฟล์ทั้งหมดและเรียกใช้headคำสั่งในแต่ละไฟล์ที่พบ headคำสั่งสามารถใช้ในการถ่ายโอนข้อมูลเพียงครั้งแรก 50 สายของแต่ละไฟล์ ในที่สุดให้ไพพ์เอาต์พุตเป็น grep เพื่อค้นหาสตริงที่คุณต้องการ

find . -type f -exec head -n 50 {} ";" | grep "matching string here"

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