ฉันgrep
จะแสดงชื่อไฟล์ต่อหน้าบรรทัดที่ตรงกันในเอาต์พุตได้อย่างไร
grep --version
นั่นคือคำสั่งที่จะใช้ในการรู้เวอร์ชัน grep หรือไม่? ถ้าเป็นเช่นนั้นมันไม่ทำงาน ไม่พบคำสั่งอื่นใดที่จะทราบรุ่น grep
grep 'pattern' *
ฉันgrep
จะแสดงชื่อไฟล์ต่อหน้าบรรทัดที่ตรงกันในเอาต์พุตได้อย่างไร
grep --version
นั่นคือคำสั่งที่จะใช้ในการรู้เวอร์ชัน grep หรือไม่? ถ้าเป็นเช่นนั้นมันไม่ทำงาน ไม่พบคำสั่งอื่นใดที่จะทราบรุ่น grep
grep 'pattern' *
คำตอบ:
ลองเคล็ดลับเล็ก ๆ นี้เพื่อเกลี้ยกล่อมgrep
ให้คิดว่ามันกำลังจัดการกับไฟล์หลายไฟล์เพื่อที่จะแสดงชื่อไฟล์:
grep 'pattern' file /dev/null
วิธีรับหมายเลขบรรทัดด้วย:
grep -n 'pattern' file /dev/null
/dev/null
ในคำสั่งนี้?
grep
มีชื่อไฟล์หลายชื่อจะแสดงชื่อไฟล์โดยอัตโนมัติก่อนการแข่งขัน แต่จะปล่อยชื่อไฟล์ออกในกรณีที่มีไฟล์อินพุตไฟล์เดียว โดยการใช้/dev/null
เป็นไฟล์อินพุตพิเศษgrep
"คิดว่า" มันจัดการกับไฟล์หลายไฟล์ แต่ / dev / null ว่างเปล่าแน่นอนดังนั้นมันจะไม่ปรากฏในรายการที่ตรงกัน ..
-H
ตัวเลือกสำหรับ grep ไม่ได้เป็นส่วนหนึ่งของ POSIX และระบบปฏิบัติการที่ใช้คือ Solaris 10 โดยที่ grep มาตรฐานหรือ POSIX เวอร์ชันที่สอดคล้องกับ grep ไม่มี-H
ตัวเลือก
find . -name foo -exec grep pattern {} \;
- สมมติความอุดมสมบูรณ์ของชื่อไฟล์foo
ในไดเรกทอรีย่อยของคุณfind
ยังคงมือgrep
ไฟล์เดียวที่จะดำเนินการในช่วงเวลาที่ /dev/null
เคล็ดลับดูเหมือนว่าจะทำงานในลินุกซ์ / OSX รสชาติทุกสิ่งที่ฉันได้พยายามเพื่อความรุ่งโรจน์! หมายเหตุ: ผมคิดว่า-H
สะอาด แต่ดังกล่าวข้างล่างก็อาจจะไม่ได้รับการสนับสนุนกับคุณgrep
รุ่นของ
หากคุณมีตัวเลือก-H
และ-n
พร้อมใช้งาน ( man grep
เป็นเพื่อนของคุณ):
$ cat file
foo
bar
foobar
$ grep -H foo file
file:foo
file:foobar
$ grep -Hn foo file
file:1:foo
file:3:foobar
ตัวเลือก:
-H, - ด้วยชื่อไฟล์
พิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา
-n, - หมายเลขบรรทัด
ใส่คำนำหน้าแต่ละบรรทัดของเอาต์พุตด้วยหมายเลขบรรทัดที่อ้างอิง 1 ภายในไฟล์อินพุต (-n ถูกระบุโดย POSIX)
-H
เป็นนามสกุล GNU แต่-n
ถูกระบุโดย POSIX
-H
ไม่รองรับที่นี่
เคล็ดลับไม่จำเป็น
grep --with-filename 'pattern' file
ด้วยหมายเลขบรรทัด:
grep -n --with-filename 'pattern' file
grep
ดังนั้นฉันไม่รู้
brew install grep
ggrep
ไม่จำเป็นต้องแก้ไข PATH
วิธีการเกี่ยวกับเรื่องนี้ซึ่งฉันจัดการเพื่อให้ได้มาซึ่งส่วนหนึ่งของโพสต์นี้
คุณต้องการค้นหาไฟล์หลาย ๆ ไฟล์สมมติว่าบันทึกที่มีชื่อแตกต่างกัน แต่มีรูปแบบ (เช่นfilename=logfile.DATE
) ภายในหลาย ๆ ไดเรกทอรีที่มีรูปแบบ (เช่น/logsapp1, /logsapp2
) แต่ละไฟล์มีรูปแบบที่คุณต้องการ grep (เช่น"init time"
) และคุณต้องการที่จะมี"init time"
ของแต่ละไฟล์ แต่รู้ว่ามันเป็นไฟล์ใด
find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
จากนั้นoutputfilename.txt
จะเป็นสิ่งที่ชอบ
./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms
โดยทั่วไปแล้ว
find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt
คำอธิบาย:
find
คำสั่งจะค้นหาชื่อไฟล์ตามรูปแบบ
จากนั้นไพพ์xargs -I{}
จะเปลี่ยนทิศทางfind
เอาต์พุตไปที่{}
ซึ่งจะเป็นอินพุตสำหรับ grep ""pattern" {}
จากนั้นเคล็ดลับที่จะทำให้การgrep
แสดงชื่อไฟล์\dev\null
และสุดท้ายเขียนผลลัพธ์ในไฟล์ด้วย tee outputfile.txt
สิ่งนี้ใช้ได้กับฉันในgrep
เวอร์ชัน 9.0.5 build 1989
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
นี่เป็นการแก้ไขเล็กน้อยจากโซลูชันก่อนหน้า ตัวอย่างของฉันค้นหาการเปลี่ยนเส้นทาง stderr ในสคริปต์ทุบตี:
grep '2>' $(find . -name "*.bash")
grep 'search this' *.txt
ทำงานให้ฉันค้นหาไฟล์. txt ทั้งหมด (ป้อนค่าการค้นหาของคุณเอง)
grep --version