Gönderen man grep(Debian üzerine) sayfa:
AÇIKLAMA
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
İlk durumda grepdosyayı açar; ikincisinde, kabuk dosyayı açar ve onu standart girişine atar grepve grepherhangi bir dosya adı argümanının geçilmemesi standart girişini tutması gerektiğini varsayar.
1'in Artıları:
grep birden fazla dosyayı grep edebilir¹.
grepHer bir oluşumun bulunduğu dosya adını görüntüleyebilir line.
2 Artıları:
- Dosya açılamıyorsa, kabuk, daha alakalı bilgiler (komut dosyasındaki satır numarası gibi) ve daha tutarlı bir şekilde (kabuğun diğer komutlar için dosyaları açmasına izin verirseniz) içerecek bir hata döndürür
grepaçar. Ve eğer dosya açılamıyorsa, grepbile çağrılmaz (bazı komutlar için - belki de grep- büyük bir fark yaratabilir).
- içinde
grep line < in > outeğer, inteneke açılamaz, outoluşturulan veya kesilmiş olmayacaktır.
- Olağandışı adlara sahip bazı dosyalarda sorun yok (
-ile başlayan veya benzeri dosya adları -) ².
- kozmetik: İsterseniz
<filekomut akışını daha doğal göstermek için komut satırında herhangi bir yere koyabilirsiniz <in grep line >out.
kozmetik: GNU ile grep, eşleşme çizgisinin önünde, sadece dosya adının yerine hangi etiketi kullanacağınızı seçebilirsiniz:
<file grep --label='Found in file at line' -Hn line
Performans açısından, dosya açılamıyorsa, grepyeniden yönlendirme kullanırken yürütülmesini kaydedersiniz, ancak aksi halde grepfazla fark beklemiyorum.
Yeniden yönlendirme ile, fazladan bir argüman iletmek zorunda kalmazsınız grep, grepargümanı biraz daha kolay ayrıştırırsınız. Öte yandan, kabuk (en azından) dup2()dosya tanıtıcısına 0 dosya tanıtıcısına fazladan bir sistem çağrısına ihtiyaç duyacaktır .
İçinde { grep -m1 line; next command; } < file, grep(burada GNU grep) seek()eşleşen satırın hemen arkasına geri dönmek isteyecek, böylece next commanddosyanın geri kalanını görecektir (ayrıca dosyanın aranabilir olup olmadığını da belirlemesi gerekecektir). Başka bir deyişle, stdin içindeki konum grepçıktının bir diğeridir . Bununla grep -m1 line file, bunu optimize edebilir, grepilgilenmesi gereken daha az şey var.
notlar
¹ ile zshyapabilirsiniz:
grep line < file1 < file2
ancak bu, cat file1 file2 | grep line( catyardımcı programı çağırmadan ) eşdeğerini yapıyor ve bu yüzden daha az verimli, ilk dosya newline karakterinde bitmiyorsa ve kalıbın hangi dosyada bulunduğunu size bildirmiyorsa , karışıklığa neden olabilir.
² ksh93ve basholsa da, yönlendirme hedeflerinde kullanıldığında, kabuğun dosyayı gerçekten dosya sisteminde açmak yerine, özel amaçlar için kesiştiği dosyalar /dev/tcp/host/port(ve /dev/fd/xbazı sistemlerdeki bash) vardır. dosya sisteminde yok). tarafından tanınanla /dev/stdinaynı amaca hizmet eder , ancak en azından burada daha doğru bir şekilde isimlendirilmiştir (herhangi bir dizinde herhangi bir dizinde herhangi bir kişi oluşturabilir , yalnızca yöneticiler adı verilen bir dosyayı oluşturabilir ve yöneticiler daha iyi bilmelidir).-grep-/dev/tcp/host/port