Katakanlah saya memiliki file berikut:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Secara default, grep
mengembalikan setiap baris yang berisi istilah pencarian:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Melewati --color
parameter ke grep
akan membuatnya menyorot bagian dari baris yang cocok dengan ekspresi pencarian, tetapi masih hanya mengembalikan baris yang berisi ekspresi. Apakah ada cara untuk mendapatkan grep
output setiap baris dalam file sumber, tetapi sorot pertandingan?
Peretasan mengerikan saya saat ini untuk mencapai ini (setidaknya pada file yang tidak memiliki 10.000+ baris berturut-turut tanpa kecocokan) adalah:
$ grep -B 9999 -A 9999 test test
Jika grep
tidak bisa melakukan ini, apakah ada alat baris perintah lain yang menawarkan fungsi yang sama? Saya sudah mengutak-atik ack
, tetapi tampaknya tidak memiliki pilihan untuk itu juga.
grep
highlighting
Michael Mrozek
sumber
sumber
-C 9999
tempat.-A 9999 -B 9999
Saya selalu melakukan:grep -C 9999 pattern file
Jawaban:
Apa yang kami lakukan di sini adalah mencocokkan dengan
$
pola dan pola pengujian, jelas$
tidak memiliki apa pun untuk diwarnai sehingga hanya pola pengujian yang berwarna. The-E
hanya menyala pencocokan regex diperpanjang.Anda dapat membuat fungsi dengan mudah seperti ini:
sumber
highlight () { grep --color -E "$1|$" $2 ; }
. Penggunaan:highlight test yourfile
"$2"
juga harus dikutip.highlight () { grep --color -E "$1|$" "$@" }
yang memungkinkan file dengan spasi putih dalam nama mereka dan beberapa file."$1"
di file. Gunakanhighlight () { grep --color -E "$1|$" "${@:1}" }
untuk Ubuntu dan Debian, gunakan ack-grep alih-alih ack
sumber
--regexp string
; padanan ack / ack-grep adalah--match string
ack --passthru
dengan perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
juga berfungsi di stream! Misalnya,ifconfig | ack --passthru inet
Cara lain untuk melakukan ini dengan benar dan mudah dibawa dengan
grep
(selain menggunakan dua regex dengan pergantian seperti pada jawaban yang diterima) adalah melalui pola nol (dan masing-masing string nol).Ini harus bekerja sama baiknya dengan keduanya
-E
dan-F
beralih karena, sesuai standar :dan
Jadi itu hanya masalah berlari
dan masing-masing
sumber
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
tidak hanya menghasilkan 2 di 2,27 (dan 2,26, tetapi tidak 2,25, dan tidak di git head). Hanya dengan-F
(bukan tanpa atau dengan -E). TKI, hanya 2,26 dan 2,27 tampaknya memiliki bug dan hanya dengan -F.seq 3 | grep -F -e '' -e '' -e 2
tampaknya bekerja dengan baik dengan 2.27-F
, mengurangi kebutuhan untuk khawatir tentang karakter apa yang munculstring
. Anda mungkin ingin menyebutkan--color
; karena jawaban ini muncul di halaman (bila dilihat oleh suara), lebih banyak orang akhirnya membacanya sebelum jawaban yang lain.Saya memiliki fungsi berikut yang saya gunakan untuk hal-hal seperti:
Secara internal terlihat agak jelek, bagus dan mudah digunakan, seperti:
atau, untuk contoh dunia nyata yang sedikit lebih:
Anda dapat mengubah warna menjadi apa pun yang Anda suka (yang mungkin sulit dengan grep - Saya tidak yakin) dengan mengubah
1
dan31
dan43
(setelah\e[
) ke nilai yang berbeda. The kode untuk digunakan adalah semua lebih tempat , tapi di sini adalah intro cepat: 1 bolds teks,31
membuatnya merah, dan43
memberikan latar belakang kuning.32
atau33
akan menjadi warna yang berbeda, dan44
atau45
latar belakang yang berbeda: Anda mendapatkan idenya. Anda bahkan dapat membuatnya berkedip (dengan a5
) jika Anda cenderung.Ini tidak menggunakan modul Perl khusus, dan Perl hampir di mana-mana, jadi saya berharap itu berfungsi hampir di mana saja. Solusi grep sangat pintar, tetapi tombol --color pada grep tidak tersedia di mana-mana. Sebagai contoh, saya baru saja mencoba solusi ini pada kotak Solaris yang menjalankan bash, dan ksh lain yang sedang berjalan, dan mesin Mac OS X lokal saya menjalankan zsh. Semua bekerja dengan baik. Solaris tersedak
grep --color
solusi, namun.Ack juga luar biasa, dan saya merekomendasikannya kepada siapa saja yang belum menemukannya, tapi saya punya beberapa masalah menginstalnya pada beberapa dari banyak server yang saya kerjakan. (Saya lupa mengapa: Saya pikir terkait dengan modul Perl yang diperlukan.)
Karena saya tidak berpikir saya pernah bekerja pada kotak Unix yang tidak memiliki Perl diinstal (dengan pengecualian sistem tipe tertanam, router Linksys, dan semacamnya) Saya akan mengatakan ini cukup banyak solusi yang dapat digunakan secara universal .
sumber
Alih-alih menggunakan Grep, Anda dapat menggunakan Lebih Sedikit:
Cari seperti ini:
/pattern
EnterIni akan:
Untuk menggulir ke baris yang cocok berikutnya:
n
Untuk menggulir ke baris yang cocok sebelumnya:
N
Untuk beralih menyoroti: Esc
u
Anda juga dapat mengubah warna sorotan jika diinginkan.
sumber
Anda dapat mencoba:
Namun tidak terlalu portabel, dan bahkan jika Perl diinstal, Anda mungkin perlu mengunduh modul lain. Selain itu akan mewarnai seluruh baris, bukan hanya kata pencarian.
sumber
ripgrep
Gunakan
ripgrep
dengan--passthru
parameternya:Ini adalah salah satu alat grepping tercepat , karena itu dibangun di atas mesin regex Rust yang menggunakan automata terbatas, SIMD dan optimisasi literal agresif untuk membuat pencarian sangat cepat.
sumber
Ada cara yang jauh lebih mudah untuk melakukan ini untuk GNU grep tetapi saya tidak berpikir itu portabel (yaitu, BSD grep):
Dalam pipa:
cat <file> | grep --color=always -z <query>
Pada file:
grep --color=always -z <query> <file>
Kredit pergi ke jawaban Cyrus di sini .
sumber
--color
itu juga bukan standar .)Tidak ada jawaban yang diberikan sejauh ini memberikan solusi portabel .
Berikut ini adalah portable 1 fungsi shell saya sudah diposting secara tertutup sebagai duplikat pertanyaan yang tidak memerlukan alat-alat standar non atau ekstensi non standar disediakan dengan
perl
,ack
,ggrep
,gsed
,bash
dan sejenisnya tetapi hanya membutuhkan shell POSIX dan POSIX utilitas wajibsed
danprintf
:Anda dapat menggunakannya seperti itu:
Warna highlight dapat disesuaikan dengan menggunakan salah satu kode ini dalam argumen perintah sed (32m menjadi hijau di sini):
1 Selama terminal Anda mendukung urutan pelolosan warna ANSI.
sumber
Sebuah
sed
versi, bekerja pada keduabash
danash
.sumber
OP meminta
grep
, dan itulah yang saya sarankan ; tetapi setelah berusaha keras untuk memecahkan masalah dengansed
, sebagai catatan, berikut adalah solusi sederhana untuk itu:atau
Akan dicat
main
merah.\E[31m
: urutan mulai warna merah\E[0m
: tanda warna jadi&
: pola yang cocok/g
: semua kata dalam satu baris, bukan hanya yang pertama$'string'
adalah string bash dengan karakter yang lolos ditafsirkanMengenai grep , ia juga bekerja menggunakan
^
(mulai dari baris) bukan$
(akhir dari baris). Contoh:Dan hanya untuk menunjukkan alias gila ini yang SAYA TIDAK MENYARANKAN , Anda bahkan dapat membiarkan tanda kutip terbuka:
semua bekerja! :) Jangan khawatir jika Anda lupa untuk menutup kutipan, bash akan mengingat Anda dengan "karakter garis lanjutan".
sumber