İlk satırı grep komutunu kullanarak nasıl yazdırabilirim?


17

Adlı bir dosyam var file.txt. İlk satırı yalnızca grepkomutu kullanarak nasıl yazdırabilirim ?


4
Çalışmaz mıydı head -1 file.txt?
clk

@steeldriver bir cevap yapmanız gerekir, çünkü bu iş için garip seçilmiş bir araç grep ile yapmanın yolu.
MelBurslan

1
grepbir dosyanın ilk satırını yazdırmak için en iyi araç değildir. İlk satırla eşleşen ilk satırı yazdırmak grepistiyorsanız veya bunun için belirli bir kullanımınız varsa grep, lütfen bunun ne olduğunu bize bildirin. Daha fazla bağlamımız olsaydı, belki size ve topluma daha iyi yardımcı olacak bir cevap verebiliriz.
DKing

@MelBurslan file.txt dosyasında üç satırım var: Bu yeni bir dosya. İkinci satır: Dosyanın adı newFile Üçüncü satır: Yeni satırı oluşturmadım. Peki grep komutunu kullanarak sadece ilk satırı nasıl yazdırabilirim? Ayrıca hangi komutu hem ilk hem de son satırı yazdırmama yardımcı olur? Lütfen her iki soru için de komutları söyleyebilir misiniz?
Nithin Santhosh

Mevcut yanıtlardan herhangi biri sorununuzu çözüyorsa, lütfen onay işareti ile kabul etmeyi düşünün. Teşekkür ederim!
Jeff Schaller

Yanıtlar:


38

Geleneksel bir grep uygulaması olmasına rağmen, bunu kullanarak yapabilirsiniz

grep -m1 "" file.txt

Boş ifade herhangi bir şeyle eşleştiği için çalışır -m1, ilk eşleşmeden sonra grep'in çıkmasına neden olur

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

Çikolata kaplı muzun düşündüğüm kadar işe yaramadığını göstermek için +1.
Kamil Maciorowski

4
Bu bazı sistemlerde işe yarayabilir, ancak taşınabilir değildir:grep: unknown option -- m
Kusalananda

1
'İlk satır' ve 'ilk satır eşleşti' arasındaki farkı not edin
Charles

13

Bu bir şey değil grep. "Grep" adı , komutun yaptığı (belirli bir normal ifade için ) "düzenli bir ifadeyi global olarak ara ve yazdır" ın kısaltmasıdır .edg/re/pre

ed1969'dan itibaren etkileşimli bir çizgi editörüdür, ancak büyük olasılıkla bugün sisteminizde yüklüdür. Biz got grepgelen edve bir kısayol veya takma belirli bir işlevsellik olarak görülebilir edve sed"stream- olduğunu ed", yani (etkileşimli olmayan) akış düzenleyicisi.

sedBunun yerine kullanalım :

$ sed -n '1p' file.txt

1pDize bir küçük sed"komut" diye baskılar ( p) verilen adrese (karşılık gelen çizgi 1, ilk çizgi). Düzenleme komutu bu arada editörde 1pde aynı şeyi yapacaktır ed.

-nElde ederiz tüm dosyanın ilk satırı yani, açıkça komut dosyası tarafından basılan değildir şey çıktısını almaz file.txt.

Alternatif:

$ sed '1q' file.txt

Bu, dosyanın tüm satırlarını yazdırır, ancak qsatır 1'de () yazdırdıktan sonra ( ) 'dan çıkar . Bu tam olarak eşdeğerdir head -n 1 file.txt.

POSIX standardında (genelleme) bunun head -n Naynı olduğunu söyler sed 'Nq', yani "her satırı yazdır, ancak satırdan çık N". Nedeni headstandarda dahil edildi, simetriye tail(ve mevcut Unix uygulamalarıyla geriye dönük uyumluluğa) bağlıydı.


Bu en aydınlatıcı cevap, ilk cevap garip bir hack. Garip bir şey olduğunu biliyordum, bana grep ve ed tarihini gösterdiğiniz için teşekkür ederim. Şimdi hepsi anlam kazanıyor.
Tomas Zubiri

6

İlk satırın benzersiz bir dizesi yoksa, bunu yalnızca grep kullanarak yapamazsınız. head -n 1 file.txtyerine çalışırdı.

İlk satırı yalnızca bir desenle eşleşiyorsa yazdırmak istiyorsanız, o zaman boru kafasını grep'e borulayın

head -n 1 * | grep [pattern]


2

Grep'in Bir Başka Alışılmadık Kullanımı - çizgileri numaralandırmak için birkaç jirasyondan geçen bir Schwartz Dönüşümü , daha sonra satır numarasını aramak için grep'i kullanır, ardından satır numarasını geri çeker:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Ben sırf fikrinin bir örnek olarak burada bu Yanıtı atıyorum olabilir (grep veya Bash ya ... vb) bir şeyler yapmak, bunu değil anlama geliyor should - iş için daha iyi bir araç muhtemelen var. sed ( sed 1qveya sed -n 1p) ve head ( head -n 1), bir dosyadan ilk satırı yazdırmak için daha uygun araçlardır. Bir dosyanın son satırını yazdırmak için, sahip tail -n 1veyased -n '$p'. Bu araçlar sadece tek bir komut değil (yukarıdaki işlevlerde 3+ yerine), aynı zamanda gelecekteki okuyucular için - belki de kendiniz için çok daha açıktır! Sorunuzun (şu anda 3) aşağı seçmeninden biri olmasam da, muhtemelen iş için keyfi bir araçta (herhangi bir destekleyici neden olmadan) ısrarınızın nedeni aşağı oylar. Tesiste bir sistem yapması imkansızdır grepda yok head, tailve sed.

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.