Renklendirilmiş grep - vurgulanan eşleşmelerle tüm dosyayı görüntüleme


509

Ben bulmak grep's--color=always bayrağı müthiş yararlı olduğu. Ancak, grep yalnızca eşleşmeli satırlar yazdırır (bağlam satırları istemediğiniz sürece). Yazdırdığı her satırın bir eşleşmesi olduğu göz önüne alındığında, vurgulama olabildiğince fazla özellik eklemez.

Gerçekten catbir dosya istiyorum ve desen eşleşmeleri ile vurgulanan tüm dosyayı görmek istiyorum .

Grep'e bir eşleşme olup olmadığına bakılmaksızın okunan her satırı yazdırmasını söyleyebileceğim bir yol var mı? Bir dosyanın her satırında grep çalıştırmak için bir komut dosyası yazabilirim biliyorum, ama bunun standart ile mümkün olup olmadığını merak ettim grep.


1
birden fazla desen için birden fazla renk istiyorsanız (örn. hata, uyarı, bilgi vb. mesajlar) kullanınsed . sedçözeltisi ilave karmaşıklık maliyeti (yerine yaklaşık 30 karakterden 60 hakkında karakterler var) de birden çok renk alır.
Trevor Boyd Smith

Sed ile + dönüş çıkış kodunu bile vurgulayabilirsiniz , örneğe bakın: askubuntu.com/a/1200851/670392
Noam Manos

Yanıtlar:


797

İşte bunu yapmanın bazı yolları:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file

152
Bu | $ hile düzgün! Aferin, bunu hatırlamak zorundayım. Normal ifade anlayışlı olmayanlarınız için, "desen | $", aradığınız desene sahip satırlarla VE sonu olan satırlarla (yani hepsiyle) eşleşir. Bir satırın sonu aslında herhangi bir karakter olmadığından, çıktının renklendirilmiş kısmı sadece deseniniz olacaktır. Teşekkürler Ryan!
zslayton

55
Ayrıca "$" egrep --color "pattern|" file
değerini

15
@Zack, "|" operatörü bir VEYA operatörüdür, bir VE değildir,
JBoy

16
@JBoy, boole mantığı yerine geleneksel İngilizcede 'AND' kullanıyordum. Haklısın, gerçekten bir 'veya' operatör - bu ve bununla eşleşiyor. : P İyi açıklama.
zslayton

12
Birden fazla düzen eşleştirilirse "$" gerektiği görülür. egrep --color "pattern1|pattern2|$". Aksi takdirde renk vurgulaması gerçekleşmez.
ZaSter

91

İşte aynı çizgide bir şey. Şansınız, zaten daha az kullanacaksınız, bu yüzden şunu deneyin:

less -p pattern file

Deseni vurgulayacak ve dosyadaki ilk oluşumuna atlayacaktır.


4
Ayrıca boru kullanarak çalışır (stding okuma) -:… | less -p pattern -
phk

3
@ phk: Çizgiyi bile atlayabilirsiniz.
sonraki duyuruya kadar duraklatıldı.

Ayrıca, -iseçeneğin eklenmesi eşleşme durumunu olduğu gibi duyarsız hale getirir less -ip pattern file.
steveb

... ve ANSI renkli girişte borular varsa less, -Ranahtarı sağlayın :… | less -Rip introduction -
Abdull

48

Ack'i tavsiye etmek istiyorum - programcılar için güçlü bir arama aracı olan grep'ten daha iyi .

$ ack --color --passthru --pager = "$ {PAGER: -less -R}" desen dosyaları
$ ack --color --passthru desen dosyaları | daha az -R
$ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}"
$ ack --passthru desen dosyaları

Ben dizinleri tekrarlayan arama varsayılan (ve çok daha akıllı grep -r) varsayılan , tam Perl düzenli ifadeleri (POSIXish yerine) destekler regex(3)ve birçok dosya ararken çok daha hoş bir bağlam ekranına sahip olduğu için seviyorum .


2
Ancak, zaman zaman orada olması gerektiğinden emin olduğumda ne istediğimi bulamıyor. ackakıllı, ancak bazen çok akıllı ve isabetin içinde bulunduğu dosya türünü
içermedi

4
@MPi ack -a, .git/ .svn/vb. Hariç tüm dosya türlerini
arayacaktır

1
Ancak, ackresimlerimde arama -ayapmayan, çok fazla. Bir örnek vermek --type-set=freemarker=.ftliçin ekledim ~/.ackrc.
Michael Piefel

3
Birkaç yapılandırma ayarı ile grep, ack'in yaptığı her şeyi zaten yapar, daha hızlıdır ve ack'in beyaz listeleri bazen yaptığı gibi sonuçları asla atlamaz. Belki de tercih ettiğiniz grep ayarlarını .bashrc dosyasına kaydedin. Benimki: grp () işlevi {GREP_OPTIONS = "- rI --color --exclude-dir = \. Git --exclude = tags" grep "$ @"
Jonathan Hartley

22

Benim kullanabilirsiniz highlightkomut dosyası https://github.com/kepkin/dev-shell-essentials

Bu var iyi daha greponun her maç vurgulamak çünkü kendi renginde .

$ command_here | highlight green "input" | highlight red "output"

Github projesinden ekran görüntüsü


3
Soru açıkça grep* nix çalıştıran makinelerde standart bir yardımcı olan bir çözüm istedi .
zslayton

1
Bu komut dosyası iyi, ancak coloutbaşka bir cevapta belirtildiği kadar iyi değil .
Jonathan Hartley

@JonathanHartley Peki neden böyle? Bunun için bir neden göremiyorum. Ayrıca, bu komut dosyası çok daha basit bir uygulama kullanır colout, bu da ne yaptığını denetlemek istiyorsanız iyi olur.
HelloGoodbye

@HelloGoodbye Evet, yeterince adil. Yargıyı ertelemeliyim. colout daha kapsamlı ve güçlüdür, ancak kullanım ve tersine mühendisliğin buna göre daha karmaşık olduğu konusunda haklısınız.
Jonathan Hartley

@JonathanHartley Daha güçlü olması mantıklı!
HelloGoodbye

19

Ayrıca bir takma ad da oluşturabilirsiniz. Bu işlevi .bashrc (veya osx üzerinde .bash_profile) klasörünüze ekleyin

function grepe {
    grep --color -E "$1|$" $2
}

Artık takma adı şu şekilde kullanabilirsiniz: "ifconfig | grepe inet " veya " grepe css index.html" .

(PS: source ~/.bashrcmevcut oturumda bashrc'yi yeniden yüklemeyi unutmayın )


sisteminizde varsa egrep komutunu da kullanabilirsiniz.
Tom

1
Bunun sonucunu daha az boruya bağlamak renk bilgisini kaybeder. Bunu nasıl önlersiniz?
Connor Clark

5
@Hoten use --color=alwaysyerine--color
limp_chimp

3
Ve lessrenk kodlarını yorumlamak için kullanın less -R.
Eliah Kagan

$ 2 değerinin kullanılmayan kullanımı boş kasa değildir. Bir bash grepe () işlevini tercih ederim {local pattern = "$ 1" shift egrep --color "$ pattern | ^" "$ @"} Biçimlendirme karışıklığı için özür dilerim.
Robert Klemme

16

coloutProgramı kullan : http://nojhan.github.io/colout/

Bir metin akışına renk vurguları eklemek için tasarlanmıştır. Bir normal ifade ve bir renk (ör. "Kırmızı") verildiğinde, eşleşmeler vurgulanmış bir metin akışı üretir. Örneğin:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

Birden çok farklı renk vurgusu eklemek için birden çok çağrıyı zincirleyebilirsiniz:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

Ya da N grupları (normal ifadenin parantez içindeki kısımları) ve ardından virgülle ayrılmış bir N renk listesi ile bir normal ifade kullanarak da aynı şeyi başarabilirsiniz.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red

1
Başka bir yerde belirtildiği gibi, soru * nix çalıştıran makinelerde standart bir yardımcı olan grep kullanan bir çözüm istedi.
zslayton

4
@Zack tamam üzgünüm. Aslında, sorunu ötesine genişletirseniz grepve zaten cevaplarda genişletilmişse, coloutyaşadığınız sorun için en iyi çözümdür, farkında olduğum en iyisidir. UNIX felsefesine göre, bir şeyi iyi yapmak için programlar yazılmalıdır. Çünkü grepmetin akışını filtreliyor. Çünkü coloutmetin akışını renklendirir veya vurgular.
user2683246

Bu en iyi cevaptır, çünkü birden fazla farklı renkli vurgu uygulayabilir ve coloutbu kadar yaygın bir araçtır. Ziyade vurgulamak logfiles, başka vurgulamak için bir test çıktısı, vb bir öğrenme aracı daha birçok durumlarda kullanmak, bir kez bilgi
Jonathan Hartley

9

"Linux Server Hacks" den rcg kullanıyorum, O'Reilly. İstediğiniz şey için mükemmeldir ve her biri farklı renklerle birden fazla ifadeyi vurgulayabilir.

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}


6

Bunu .bash_aliases'ime ekledim:

highlight() {
  grep --color -E "$1|\$"
}

3

Tüm dosyayı görüntülerken desenleri vurgulamak için h bunu yapabilir.

Ayrıca farklı desenler için farklı renkler kullanır.

cat FILE | h 'PAT1' 'PAT2' ...

Seni Ayrıca boru çıkışı hiçin less -Rdaha iyi okumak için.

Her desen için 1 renk kullanmak ve kullanmak için, cxpgrep iyi bir uyum olabilir.


1

Tamam, bu bir yol,

wc -l filename

size satır sayısını verecektir - NN deyin, o zaman yapabilirsiniz

grep -C NN --color=always filename

3
Eğer önce wc istemiyorsanız "-C 2147483647". Burada büyük bir sayı kullanmak işleri yavaşlatıyor gibi görünmüyor.
barrycarter

1

İşte aradığınız metni parlak kırmızı renkte görüntülemek için uygun kaçış dizisiyle değiştirmek için Awk'un gsub işlevini kullanan bir kabuk betiği:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

Şöyle kullanın:

$ ./cgrep pattern [file]

Ne yazık ki, grep'in tüm işlevlerine sahip değil.

Daha fazla bilgi için Linux Journal'da " So Like Like Like " adlı makaleye başvurabilirsiniz.


1

Bir diğer cevap da grep'in n Context satırını içeren -Cn anahtarından bahsetti. Bazen bunu eg = desen çok hareketsiz göründüğünde veya rcg yüklemediğim bir makinede olduğumda [en azından] bağlamın ekran görüntüsünü almanın hızlı ve kirli bir yolu olarak n = 99 ile yaparım ve / veya ccze.

Son zamanlarda cczedaha güçlü bir renklendirici olduğunu keşfettim . Benim tek şikayet less"Ham ANSI" çıkışı için -A anahtarı belirtmedikçe (bu nedenle asla bu nedenle kullanmak gibi) ekran odaklı olmasıdır .

rcgYukarıda belirtilenler için +1 . Bir takma adda özelleştirmek çok basit olduğu için hala favorim. Böyle bir şey genellikle benim ~ / .bashrc içinde:

takma ad tailc = 'tail -f / my / app / log / file | rcg "BOLD GREEN" gönder "CYAN" hatası "RED" alır


1

başka bir kirli yol:

grep -A80 -B80 --color FIND_THIS IN_FILE

Yaptım

alias grepa='grep -A80 -B80 --color'

bashrc.


1
aradığınız şeyler orada değilse bu sorunludur. Bir hata nedeniyle söyleyin, bu durumda hiçbir şey alamazsınız.
Paul Rubel


0

Farklı renklerle birkaç deseni vurgulamak istiyorsanız, bu bash betiğine bakın.

Temel kullanım:

echo warn error debug info 10 nil | colog

Bir tuşa basıp ardından enter tuşuna basarken desenleri ve renkleri değiştirebilirsiniz.


0

Benzer bir amaç için aşağıdaki komutu kullanıyorum:

grep -C 100 searchtext file

Bu, grep'in vurgulanan arama metninden önce ve sonra 100 * 2 bağlam satırı yazdırmasını söyleyecektir.


0

İşte @ kepkin'in çözümünden ilham alan yaklaşımım :

# Adds ANSI colors to matched terms, similar to grep --color but without
# filtering unmatched lines. Example:
#   noisy_command | highlight ERROR INFO
#
# Each argument is passed into sed as a matching pattern and matches are
# colored. Multiple arguments will use separate colors.
#
# Inspired by https://stackoverflow.com/a/25357856
highlight() {
  # color cycles from 0-5, (shifted 31-36), i.e. r,g,y,b,m,c
  local color=0 patterns=()
  for term in "$@"; do
    patterns+=("$(printf 's|%s|\e[%sm\\0\e[0m|g' "${term//|/\\|}" "$(( color+31 ))")")
    color=$(( (color+1) % 6 ))
  done
  sed -f <(printf '%s\n' "${patterns[@]}")
}

Bu, birden fazla argümanı kabul eder (ancak renkleri özelleştirmenize izin vermez). Misal:

$ noisy_command | highlight ERROR WARN

-1

Grep'e bir eşleşme olup olmadığına bakılmaksızın okunan her satırı yazdırmasını söyleyebileceğim bir yol var mı?

Option -C999, tüm bağlam çizgilerini görüntüleme seçeneği olmadığında işe yarayacaktır. Diğer birçok grep varyantı da bunu desteklemektedir. Bununla birlikte: 1) hiçbir eşleşme bulunmadığında çıktı üretilmez ve 2) bu seçenek grep'in verimliliği üzerinde olumsuz bir etkiye sahiptir: -Cdeğer büyük olduğunda, hangi bağlam çizgilerini belirlemek için grep'in geçici olarak bellekte saklanması gerekebilir. Bir eşleşme meydana geldiğinde görüntülenmesi. Grep uygulamalarının girdi dosyalarını yüklemediğini, bunun yerine birkaç satırı okuduğunu veya girdinin üzerinde kayan bir pencere kullandığını unutmayın. Bağlamın "önce bölümü", daha sonra bir eşleşme bulunduğunda "önce" bağlam satırlarını çıkarmak için bir pencerede (bellekte) tutulmalıdır.

Gibi bir örüntü ^|PATTERNveya PATTERN|$bu konu için herhangi bir boş-eşleşen alt örüntü [^ -~]?|PATTERNgüzel bir numaradır. Ancak, 1) bu modeller bağlam olarak vurgulanan eşleşmeyen satırları göstermez ve 2) bu, örneğin -Fve gibi diğer bazı grep seçenekleriyle birlikte kullanılamaz -w.

Yani bu yaklaşımların hiçbiri beni tatmin etmiyor. Ben ugrep ve -yetkin bir renk vurgulanan bağlam çizgileri olarak eşleşmeyen tüm çıkış görüntülemek için seçeneği ile gelişmiş grep kullanıyorum . Ag ve ripgrep gibi diğer grep benzeri araçlar da bir geçiş seçeneği sunar. Ama ugrep GNU / BSD grep ve teklifler gibi grep seçenekler üst dizisi ile uyumludur -yve -Q. Örneğin, seçenekle -ybirleştirildiğinde gösterilen seçenek şu şekildedir -Q(desen girmek için etkileşimli sorgu kullanıcı arayüzü):

ugrep -Q -y FILE ...

Neden yorum bırakmadan oy veresiniz ki? Diğer cevapların bazıları gibi alternatif grep araçlarından bahsetmek daha adil.
Dr. Alex RE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.