Satırı eşleştirmeden önce dosya adını görüntüle


282

grepDosya adını çıktısında eşleşen satırlardan önce nasıl görüntüleyebilirim?


2
pls grep sürüm söylegrep --version
Kent

3
kent, grep --versiongrep sürümünü bilmek için kullanılacak komut bu mu? Eğer öyleyse, çalışmıyor. Grep sürümünü bilmek için başka bir komut bulunamadı.
Vivek

2
iyi soru ama 'Os versiyonu' kafa karıştırıcı bir örnek dosya
adıdır

1
İşletim sistemi ve sürüm burada önemsizdir.
MD XF

grep 'pattern' *
user0

Yanıtlar:


430

grepDosya adını görüntülemesi için birden fazla dosyayla uğraştığını düşünmek için bu küçük numarayı deneyin :

grep 'pattern' file /dev/null

Satır numarasını almak için:

grep -n 'pattern' file /dev/null

6
Evet, işe yaradı. Lütfen bana /dev/nullbu komutu eklemenin önemini söyleyebilir misiniz ?
Vivek

55
Birden grepfazla dosya adıyla birlikte verilirse , dosya adlarını eşleşmeden önce otomatik olarak görüntüler, ancak tek bir giriş dosyası olması durumunda dosya adını dışarıda bırakır. /dev/nullEk bir giriş dosyası olarak kullanarak grepbirden fazla dosya ile ilgili "düşünüyor", ancak / dev / null elbette boş, bu yüzden maç listesinde
görünmez

32
/ dev / null kullanmak akıllıca bir numara ama sanırım -H bayrağının altındaki öneri daha iyi bir cevap.
JohnQ

22
Tamam, ancak -Hgrep seçeneği POSIX'in bir parçası değildir ve kullanılan işletim sistemi, ne standart grep'in ne de grep'in POSIX uyumlu sürümünün -Hseçeneği olmadığı Solaris 10'dur .
Araştırmacı

4
Eğer gibi, Bul ile grep kullanıyorsanız önemli olduğunu find . -name foo -exec grep pattern {} \;- adlandırılmış dosyalara bol varsayarak foosenin alt dizininde, findhala eller grepbir anda çalışacak şekilde tek bir dosya. /dev/nullHile, bravo, denedim hepsi linux / osx tatlar iş gibi görünüyor! Ben düşünüyorum Not -Htemizleyici, ancak aşağıda belirtildiği gibi, onunla desteklenmiyor olabilir senin sürümüne grep.
Jon V

297

Seçenekleriniz varsa -Hve -nmevcutsanız ( man greparkadaşınız ise):

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

Seçenekler:

-H, - dosyaadı ile

Her eşleşme için dosya adını yazdırın. Aranacak birden fazla dosya olduğunda bu varsayılan değerdir.

-n, - satır numarası

Her çıktı satırına, girdi dosyasındaki 1 tabanlı satır numarası ile önek ekleyin. (-n, POSIX tarafından belirtilir.)

-Hbir GNU oluşumudur, fakat -nedilir POSIX tarafından belirlenen


3
Hayır, -Hburada desteklenmiyor.
Vivek

1
Desteklenir, ancak her zaman grep verir: dosya: Böyle bir dosya veya dizin yok
pal4life

2
Ubuntu -H ve -n üzerinde çalışır. Muhtemelen *
nix'in

1
Bu seçenekler olduğunu düşünmeden akşamları yıllarca bununla mücadele ettim!
GreenSaguaro

45

Hile gerekmiyor.

grep --with-filename 'pattern' file

Satır numaraları ile:

grep -n --with-filename 'pattern' file

3
@codeforester Başka birini bilmiyorum grep, bu yüzden bilmiyorum.
MD XF

2
Güzel ! Bu linux için çalıştı. mac kullanıyorsanız, demlemek ile coreutils kurabilirsiniz. Ve siz de PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH"
eklemeyi unutmayın

2
Bu (aynı zamanda) çalıştı MinGW (1.0.17, sanırım).
Peter Mortensen

Yerleşik Mac grep (2.5.1-FreeBSD) ile benim için çalışıyor. Ancak Homebrew'un alternatif grep'ini kullanmak için, başka bir yol çalıştırmak brew install grepve daha sonra kullanmaktır ggrep. PATH üzerinde değişiklik yapmaya gerek yok.
wonderlr

5

Bu yazıya kısmen teşekkür etmeyi başardığım buna ne dersin.

Birkaç dosya bulmak istiyorsunuz, farklı isimlerle bir desen (örneğin filename=logfile.DATE) içeren günlükler diyelim , bir desene sahip birkaç dizin içinde (örn. /logsapp1, /logsapp2). Her dosya, grep (örneğin "init time") oluşturmak istediğiniz bir desene sahiptir ve her dosyanın sahip olmasını istersiniz "init time", ancak hangi dosyaya ait olduğunu bilirsiniz .

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

Sonra outputfilename.txtböyle bir şey olurdu

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

Genel olarak

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

Açıklama:

find komutu, desene göre dosya adlarını arayacaktır

Daha sonra, boru xargs -I{}yönlendirir findçıktı{}

hangi girdi olacak grep ""pattern" {}

Sonra grepdosya adlarını görüntülemek için hile\dev\null

ve son olarak çıktıyı tee outputfile.txt

Bu benim için grep9.0.5 derlemesi 1989'da çalıştı .


3
Ya da sadece find kullanarakfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Martin

1

Bu, önceki bir çözümden küçük bir değişikliktir. Örneğim bash komut dosyalarında stderr yönlendirmesini arar: grep '2>' $(find . -name "*.bash")


-7
grep 'search this' *.txt

benim için çalıştı .txt dosyaları (tabii ki kendi arama değerinizi girin).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.