Giriş yönlendirmesini ne zaman kullanmalıyım?


21

Aynı sonuçları üretmek için aşağıdaki iki komutu kullandım: -

[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

Bu iki tarafın herhangi biri birbirine yaklaşırsa, lütfen bana herhangi bir artı / eksisini açıklayabilir.

Yanıtlar:


28

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


+1, güzel açıklama için. Bir şüphem var: 2. durumda, kabuk dosyayı açtığında açılan dosya içeriğini standart girişe (klavye) geçirir mi ?? ('Grep'in standart girişi' terimiyle karıştırıldım).
Ankit,

1
@Ankit, stdin, uygulamaların girişlerini varsayılan olarak okudukları, dosya tanımlayıcısı 0'dır. Bir terminalde, fd 0 terminal cihazındaki okumadan açılır (/ dev / ttyxx veya / dev / pts / n gibi). Klavyede yazdıklarını bu şekilde bitiriyorlar. Bir komutun stdin'in kabuk yeniden yönlendirmesi sadece komutu çalıştırmadan önce fd 0'ı başka bir dosyaya açar.
Stéphane Chazelas

6

StephaneChazelas'ın cevabı kapsar grep(1)ve çoğu Unix soy komutu bu şekilde çalışır, ama hepsi değil. Standart girdiden (klavyeden, yönlendirilen bir dosyadan < fileveya başka bir komutla gönderilen aptal bir örnekten ls * | grep '^ab*c$'veya aptal bir örnekten ) veya argümanlar olarak verilen dosyalardan okumak standart bir yöntemdir grep comment file1 file2 file3. Bazı komutlar, burada adı verilen dosyanın -standart girdi olduğu kuralını kullanır , böylece ne olursa olsun ürettiği make-middle | cat head - tailbir akış elde edersiniz . Bu, komutların kullanımında esneklik sağlamak için tasarım gereğidir.headgen-middletail

Hangisi daha iyi? Çalıştığı sürece cmd file, daha kısadır cmd < file; frobbing ( ) dosyasını yapan kabuk ile bunu yapan komut arasında zaman içinde küçük bir fark olabilir <, ancak gün boyu başka bir şey yapmazsanız muhtemelen farkedilmez. Stephane'nin cevabında belirtilen profesyoneller gibi hususlara bağlı olacaktır.


cmd fileolduğundan daha kısa değil cmd<file.
Stéphane Chazelas

Yine de, bir tuşa daha kısa basıldığında, a yazabilmek için Shift tuşuna basmanız gerektiğini varsayar <.
DopeGhoti
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.