Saya butuh bantuan dengan Grep untuk memulai bagian

8

Saya memiliki beberapa file teks yang ingin saya ambil bagian dari kode. Tujuan yang saya coba capai adalah untuk memulai tampilan pada baris tertentu & kemudian dapat membaca apa pun di bawahnya. Sebagai contoh. Dalam teks di bawah ini, bagaimana cara melihat file teks di titik awal berwarna kuning. Saya ingin melihat konten "kuning" serta semua yang ada di bawahnya, apa pun kontennya.

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
John Smith
sumber

Jawaban:

9

Penggunaan AWKAWK - itu yang paling sederhana karena dapat diperoleh:

awk '/yellow/,0' textfile.txt

Contoh dijalankan

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

Grep

Anda juga bisa menggunakan grepdengan --after-contextpilihan, untuk mencetak sejumlah baris setelah pertandingan

grep 'yellow' --after-context=999999  textfile.txt

Untuk pengaturan konteks otomatis, Anda dapat menggunakan $(wc -l textfile.txt). Ide dasarnya adalah bahwa jika Anda memiliki baris pertama sebagai pasangan dan Anda ingin mencetak semuanya setelah pertandingan itu, Anda perlu mengetahui jumlah baris dalam file minus 1. Untungnya, --after-contexttidak akan melempar kesalahan tentang jumlah baris, sehingga Anda bisa memberikan nomor itu sepenuhnya di luar jangkauan, tetapi jika Anda tidak mengetahuinya, jumlah total garis akan dilakukan

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

Jika Anda ingin mempersingkat perintah --after-contextadalah opsi yang sama dengan -Adan $(wc -l textfile.txt), akan diperluas ke sejumlah baris diikuti dengan nama file. Jadi dengan begitu Anda mengetik textfile.txthanya sekali

grep "yellow" -A $(wc -l textfile.txt)

Python

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

Atau sebagai alternatif tanpa printablebendera

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()
Sergiy Kolodyazhnyy
sumber
Anda dapat menyederhanakan grepperintah grep "yellow" -A $(wc -l textfile.txt).
Byte Commander
@ByteCommander ya, bisa dilakukan juga. Hanya menggunakan opsi lengkap untuk kejelasan
Sergiy Kolodyazhnyy
1
@ByteCommander Peretasan yang bagus. Sayangnya itu hanya berfungsi karena tidak ada spasi di nama file.
kasperd
@kasperd Oh ya, kamu benar. Dalam hal ini, Anda harus kembali ke perintah asli Serg grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt".
Byte Commander
5

Anda dapat melakukannya dengan:

awk '/yellow/{f=1}f' file

di mana "file" adalah nama file yang berisi teks Anda.

Pilot6
sumber
Pikiran besar>> :)
Sergiy Kolodyazhnyy
5

Tidak grep, tetapi menggunakan sed:

sed -n '/^yellow$/,$p' file
  • -n: menghambat pencetakan
  • /^yellow$/,$: rentang alamat yang berawal dari kemunculan pertama baris yang cocok persis yellowdengan baris terakhir inklusif
  • p: mencetak garis dalam kisaran alamat
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
kos
sumber
5

Terlambat ke pesta :)

Menggunakan grep:

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P memungkinkan kita menggunakan Regex yang kompatibel dengan Perl

  • -z membuat file input dipisahkan oleh ASCII NUL, bukan baris baru itu

  • -o hanya mengambil porsi yang diinginkan

  • (?s)adalah pengubah DOTALL, memungkinkan kami untuk mencocokkan baris baru menggunakan token .(karakter apa saja)

  • Di \n\K, cocokkan dengan \nbaris baru, \Kbuang yang cocok

  • yellow\n.*pertandingan yellowdiikuti oleh baris baru dan semuanya setelah ini dipilih juga dan ditampilkan di output.

Contoh:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

Menggunakan sedikit python:

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines adalah daftar yang berisi semua baris file (dengan membuntuti baris baru juga)

  • lines.index('yellow\n')memberi kami indeks terendah di linesmana yellow\nditemukan

  • lines[lines.index('yellow\n'):]akan menggunakan daftar slicing untuk mendapatkan porsi mulai dari yellow\nsampai akhir

  • join akan bergabung dengan elemen-elemen dari daftar untuk menghasilkan sebagai string

heemayl
sumber
Bagus, tetapi Anda harus menyebutkan bahwa kode Python hanya menemukan seluruh baris yang sama dengan "kuning", tidak mendeteksi misalnya garis seperti "lebih banyak kuning".
Byte Commander
@ByteCommander Dari contoh OP saya pikir jelas bahwa mereka ingin mencocokkan hanya yellowdalam garis .. juga jika itu tidak terjadi maka kita perlu mengubah pythonalgo seseorang ..
heemayl
Ya, tentu. Lagipula itu bukan kritik, hanya petunjuk untuk memperbaiki jawabannya. Orang lain yang membaca ini mungkin berasumsi bahwa kode itu berfungsi grepdan tidak hanya cocok dengan baris penuh. Saya memilih btw.
Byte Commander
4

Karena pertanyaan mengacu pada melihat file, selalu ada yang baik

less +/yellow file
Steeldriver
sumber
Tidak tahu lessbisa melakukan itu. Sangat bagus !
Sergiy Kolodyazhnyy