Bagaimana cara mencetak baris pertama menggunakan perintah grep?


16

Saya punya file bernama file.txt. Bagaimana saya bisa mencetak baris pertama hanya dengan menggunakan grepperintah?


4
Tidak akan head -1 file.txtbekerja
CLK

@steeldriver Anda harus menjawabnya karena ini adalah cara untuk melakukannya dengan grep, alat yang dipilih secara aneh untuk pekerjaan itu.
MelBurslan

1
grepbukan alat terbaik untuk mencetak baris pertama file. Jika Anda bermaksud ingin mencetak baris pertama yang cocok dengan grep, atau jika Anda memiliki kegunaan tertentu grep, beri tahu kami apa itu. Jika kami memiliki lebih banyak konteks, mungkin kami dapat memberikan jawaban yang akan lebih membantu Anda dan masyarakat.
DKing

@MelBurslan Dalam file.txt Saya punya tiga baris misalnya: Ini adalah file baru. Baris kedua: Nama file tersebut adalah newFile Baris ketiga: Saya belum membuat baris baru. Jadi dengan menggunakan perintah grep bagaimana saya bisa mencetak baris pertama saja? Juga Bagaimana perintah mana yang akan membantu saya untuk mencetak baris pertama dan terakhir? Bisakah kalian tolong beri tahu saya perintah untuk kedua pertanyaan?
Nithin Santhosh

Jika ada jawaban yang ada untuk menyelesaikan masalah Anda, harap pertimbangkan untuk menerimanya melalui tanda centang. Terima kasih!
Jeff Schaller

Jawaban:


37

Meskipun ini merupakan aplikasi grep yang tidak konvensional, Anda dapat melakukannya menggunakan

grep -m1 "" file.txt

Ini berfungsi karena ekspresi kosong cocok dengan apa pun, sementara -m1menyebabkan grep keluar setelah pertandingan pertama

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

1 untuk menunjukkan bahwa pisang yang dilapisi cokelat tidak berguna di sini seperti yang saya kira.
Kamil Maciorowski

4
Itu mungkin bekerja pada beberapa sistem, tetapi ini tidak portabel:grep: unknown option -- m
Kusalananda

1
Perhatikan perbedaan antara 'baris pertama' dan 'baris pertama cocok'
Charles

13

Ini bukan sesuatu yang grepdilakukan. Nama "grep" sendiri adalah akronim untuk " global " pencarian dan ekspresi reguler ", yang dilakukan oleh edperintah g/re/ptersebut (untuk ekspresi reguler yang diberikan re).

edadalah editor baris interaktif dari tahun 1969, tetapi kemungkinan besar diinstal pada sistem Anda hari ini. Kami dapat grepdaried , dan itu dapat dilihat sebagai jalan pintas atau alias untuk fungsi spesifik dari ed, dan sed, yang "stream-ed ", yaitu editor aliran (non-interaktif).

Ayo gunakan sed :

$ sed -n '1p' file.txt

The 1pstring adalah kecil sed"script" yang cetak (p ) baris sesuai dengan alamat yang diberikan ( 1, baris pertama). Perintah pengeditan 1pakan (tidak mengejutkan) melakukan hal yang sama di ededitor dengan cara.

The -nmenekan output apa pun tidak secara eksplisit dicetak oleh script, sehingga semua kita dapatkan adalah baris pertama dari filefile.txt .

Kalau tidak:

$ sed '1q' file.txt

Ini mencetak semua baris file, tetapi berhenti (q ) pada baris 1 (setelah mencetaknya). Ini persis sama denganhead -n 1 file.txt .

Dalam standar POSIX dikatakan (generalisasi) yang head -n Nhampir sama dengan sed 'Nq', yaitu "cetak setiap baris, tetapi berhenti pada baris N". Alasannya headdimasukkan dalam standar sama sekali adalah karena simetri dengan tail(dan kompatibilitas dengan implementasi Unix yang ada).


Ini adalah jawaban yang paling mencerahkan, jawaban pertama adalah hack aneh. Saya tahu ada sesuatu yang aneh, terima kasih telah menunjukkan kepada saya sejarah grep and ed. Itu semua masuk akal sekarang.
Tomas Zubiri

6

Kecuali jika baris pertama memiliki string unik, Anda tidak dapat melakukan ini hanya menggunakan grep. head -n 1 file.txtakan bekerja di tempatnya.

Jika Anda hanya ingin mencetak baris pertama jika cocok dengan pola, maka kepala pipa menjadi grep

head -n 1 * | grep [pattern]


2

Namun Penggunaan Grep Lain yang Tidak Konvensional - Transformasi Schwartzian yang melewati beberapa perputaran untuk memberi nomor pada garis, kemudian menggunakan grep untuk mencari nomor garis, kemudian menanggalkan nomor garis mundur:

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 *//"
)

Saya meletakkan Jawaban ini di sini sebagai contoh dari gagasan bahwa hanya karena Anda dapat melakukan sesuatu (grep atau bash atau ... dll), tidak berarti Anda harus - mungkin ada alat yang lebih baik untuk pekerjaan itu. sed ( sed 1qatau sed -n 1p) dan head ( head -n 1) adalah alat yang lebih tepat untuk mencetak baris pertama dari suatu file. Untuk mencetak baris terakhir file, Anda memiliki tail -n 1ataused -n '$p'. Tidak hanya alat-alat ini perintah tunggal (bukannya 3+ dalam fungsi di atas), mereka juga jauh lebih jelas untuk pembaca masa depan - mungkin diri Anda sendiri! - dari skrip yang ada. Meskipun saya bukan salah satu dari (saat ini 3) pemilih turun dari pertanyaan Anda, ada kemungkinan bahwa desakan Anda pada alat yang sewenang-wenang untuk pekerjaan itu (tanpa alasan pendukung) adalah alasan untuk downvotes. Ini sangat tidak mungkin bahwa sistem yang memiliki greptidak juga memiliki head, tail, dan sed.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.