GNU/Linux >> Belajar Linux >  >> Linux

Linux - grep dari baris tertentu ke akhir file

Saya ingin "grep" dari "baris 2A" ke akhir file:

sed -n '/2A/,$p'
  • -n :menekan sed keluaran bawaan
  • /2A/ :baris output dari yang pertama berisi "2A"
  • $ :ke akhir file

Saya ingin "grep" dari "baris 2A" ke baris berikutnya yang berisi "A":

sed -n '/2A/,/A/p'
  • /A/ :output sampai baris berisi "A"

Saya ingin "grep" dari baris pertama yang berisi "A" ke baris berikutnya:

printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

(diperluas dari komentar)

awk memiliki kemampuan untuk memilih 'rentang' garis yang cocok dengan kebutuhan ini dengan sempurna, seperti yang dijelaskan dalam manual GNU-awk (gawk). (Fitur ini berfungsi di awk lainnya tapi gawk manual mudah ditautkan.)

awk '/line 2A/,0' mencetak baris dimulai dengan yang pertama yang cocok dengan line 2A dan berlanjut sampai akhir input karena 0 adalah kondisi yang tidak pernah benar.

awk '/line 2A/,/A/&&!/line 2A/' mulai mencetak dengan baris yang cocok dengan line 2A dan berhenti setelah baris yang cocok dengan A tapi BUKAN line 2A (dan dengan demikian tidak bisa menjadi garis yang sama dengan garis start). Ini akan dimulai lagi pada selanjutnya line 2A dan seterusnya; jika Anda ingin mencegahnya, ada cara yang sedikit lebih rumit untuk melakukannya.

Jika garis pemberhentian selalu memiliki beberapa karakter selain 2 sebelum A ini dapat disederhanakan menjadi awk '/line 2A/,/[^2]A/' yang berhenti setelah baris yang cocok dengan karakter apa pun selain 2, diikuti oleh A. Anda mungkin menginginkan variasi dari ini, mis. untuk berhenti pada setiap-satu-digit-A yang berbeda dari 2A, tetapi bukan yang lain seperti WHAT; untuk itu kondisi berhenti mungkin ,/line [013-9]A/ .


Saya pikir cara terbaik adalah menggunakan grep dikombinasikan dengan cut dan tail . Pertama, gunakan grep untuk mendapatkan baris di mana string yang diinginkan (-n ke nomor baris keluaran; -m 1 untuk berhenti mencari setelah pertandingan pertama):

grep -n -m 1 "somestring" filename.txt

Ini menampilkan nomor baris dan string itu sendiri. Untuk memotong string, kami menggunakan cut (-f1 :menampilkan kolom pertama; -d: gunakan ":" sebagai pembatas):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

Selanjutnya, kami menggunakan output dari perintah ini sebagai parameter di ekor. Biasanya, tail mencetak k baris terakhir, tetapi menggunakan -n +k , kita mendapatkan ekor untuk dicetak dari garis k dan seterusnya. Perintah totalnya adalah:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

Untuk menampilkan baris hingga somestring gunakan head bukannya tail dan -n -# bukannya -n +# . Anda juga dapat menggabungkan keduanya untuk mendapatkan baris dari satu string ke string lainnya.


Linux
  1. Menghapus Baris Tertentu dari File di Baris Perintah Linux

  2. Linux - periksa apakah ada baris kosong di akhir file

  3. Bagaimana cara menampilkan baris tertentu dari file teks di Linux?

  1. Konfigurasikan ruang kerja Linux dari jarak jauh dari baris perintah

  2. Bekerja dengan pipa di baris perintah Linux

  3. Pelaporan I/O dari baris perintah Linux

  1. Menggunakan Google Drive dari Baris Perintah Linux

  2. Gambarkan Secara Acak Sejumlah Garis Dari File Data?

  3. Pergi ke Awal atau Akhir File di Vim [Kiat Singkat]