ฉัน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