it-swarm-id.com

Tampilkan semua file hingga sesuai

grep --before-context 5 menunjukkan 5 baris sebelum pertandingan.

Saya ingin menunjukkan segalanya sebelum pertandingan.
Melakukan grep --before-context 99999999 akan bekerja tetapi tidak terlalu ... profesional.

Bagaimana cara menampilkan semua file hingga sesuai?

78
Nicolas Raoul

Sed lebih baik untuk itu.

Kerjakan saja:

sed '/PATTERN/q' FILE

Ini berfungsi seperti ini:

Untuk setiap baris, kami melihat apakah itu cocok /PATTERN:

  • jika ya, kami cetak dan berhenti
  • jika tidak, kami mencetaknya

Ini adalah solusi yang paling efisien, karena begitu ia melihat PATTERN, ia berhenti. Tanpa q, sed akan terus membaca sisa file, dan tidak melakukan apa-apa dengannya. Untuk file besar itu dapat membuat perbedaan.

Trik ini juga dapat digunakan untuk meniru head:

sed 10q FILE
104
Mikel

sed dapat menggantikan sebagian besar fungsi grep.

sed -n '1,/<pattern>/ p' <file>

Ini berarti mencetak dari baris pertama hingga pola cocok.

Beberapa contoh rentang

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
39
forcefsck

cetak hingga dan termasuk kecocokan:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

cetak hingga TAPI TIDAK termasuk pertandingan:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
39
glenn jackman

Bagi orang yang memilih untuk mengingat hanya alat dasar dalam pekerjaan sehari-hari, dan bersedia menerima solusi yang kurang elegan dan kurang efisien:

head -n $(grep -n pattern filename | cut -d: -f1) filename

Jika perintah ini untuk skrip maka saya akan mencari solusi yang lebih elegan (dan mungkin efisien). Jika ini adalah perintah satu kali atau skrip dibuang maka saya tidak peduli.

1
lesmana

Menambahkan jawaban Mikel di atas ...


Untuk mencetak semua baris hingga, tetapi tidak termasuk , baris pertama dalam FILE berisi PATTERN, coba:

  • sed '/.*PATTERN.*/{s///;q;}' FILE

Ini cocok dengan seluruh baris yang berisi pola, menggantikannya dengan baris kosong, lalu berhenti tanpa memproses sisa file.


Nota bene:

Cara termudah/paling jelas yang bisa saya pikirkan untuk mencegah mencetak baris baru tambahan di akhir (tanpa melibatkan alat lain), adalah menjalankan sed lagi dan menghapus baris akhir baru:

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

... dan karena kita sekarang menghapus garis itu, pekerjaan kita sebelumnya berlebihan dan kita dapat menyederhanakan untuk:

sed '/PATTERN/q' FILE | sed '$d'
1
Jim Grisham

Metode murni GNU grep berikut ini tidak efisien.

Cari semuanya hingga instance string pertama " foo " di file bilah , menggunakan tiga greps:

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

Mencocokkan hingga terakhir contoh dari " foo ":

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

Catatan: perincian pada grep terakhir dapat ditemukan di: Regex (grep) untuk pencarian multi-baris diperlukan .

1
agc

Anda juga dapat menggunakan salah satu dari yang berikut ini

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

atau

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

atau

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

Opsi pertama sangat mirip dengan apa yang disarankan OP hanya itu memastikan ti menunjukkan cukup baris sebelum konteks dengan menghitung baris dalam file

Opsi kedua mencari nomor baris dari pertandingan pertama (Anda bisa mengubahnya juga dengan mengubah 'kepala' bagian dalam) dan daripada menggunakan kepala di nomor itu

Opsi terakhir menggantikan semua baris baru dengan pertandingan dan daripada mengganti dua pertandingan yang berdekatan dengan baris baru. Output dari ini adalah baris untuk setiap blok teks antara dua kecocokan. Setelah itu menggunakan 'head' untuk memilih baris pertama (mengubah blok teks hingga pertandingan pertama) cocok dan kemudian menerjemahkan ulang setiap pertandingan ke baris baru. opsi ini hanya berfungsi jika file dalam format berikut

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

dan seterusnya

0
user122778