Jak wyróżnić dopasowania za pomocą GNU grep?

18

Widziałem na niektórych Linuksie, który grepjest skonfigurowany, aby podświetlić dopasowanie i wydrukować pasujący plik.

Jak mogę skonfigurować greppodświetlanie meczów?

Elmarco
źródło

Odpowiedzi:

10
alias cgrep='grep -nR --color'

Stosowanie:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Również jeden z moich ulubionych:

$ pgrep some-hanging-process

wyświetli listę wszystkich procesów, które pasują do nazwy jakiegoś wiszącego procesu, którego możesz użyć w następującej sytuacji:

$ kill $(pgrep some-hanging-process)
Eimantas
źródło
12
istnieje ostatnia komenda pkill
diega
1
Z ostatnich wersji GNU grep, grep -rpowinny być ogólnie bardziej korzystne niż grep -Rjak były nie przechodzić dowiązania.
Stéphane Chazelas
19

Odkryłem, że najlepszym sposobem na alfons grep jest użycie ack , który jest zasadniczo rekurencyjnym grepem z inteligentną listą ignorowania (np. Nie przeszukuje katalogów .svn, ignoruje pliki kopii zapasowych itp.), Podświetlenie kolorów wyników i perl regexps. To jest to, co chcesz, aby grep robił w 98,6% przypadków.

Kai
źródło
5
+1 za wzmiankę o potwierdzenie. Nie zapomnij dołączyć opcji --pager = "mniej -R", aby zachować podświetlanie wyników stronicowanych. Warto również wspomnieć, że w Ubuntu jest określane jako „ack-grep”, ponieważ pobierane jest „ack”.
Shawn Chin,
Ja również używam ack, ale czasami nie masz go dostępnego.
elmarco,
2
Od ACK jest tylko skrypt Perl, to może uczynić z niego dostępny wszędzie gdzie masz zainstalowaną Perl, który nie jest wysoki bar.
Kai
Ack jest dobry z powodu domyślnych ustawień domyślnych, ale w czasie, w którym zajmuje się instalacja ack, mogłeś skonfigurować niektóre ustawienia domyślne dla grep - zobacz moją odpowiedź w innym miejscu na tej stronie. Zrobiłem to raz w latach 80. i od tego czasu grep zrobił wszystko, co robi. (tylko grep jest w rzeczywistości szybszy, pomimo głośnych twierdzeń Aka, że ​​jest inaczej)
Jonathan Hartley,
7

Ustawiłem to w moim .bashrc, zamiast redefiniować grep za pomocą aliasu:

    export GREP_OPTIONS="--color=auto"

Dla mnie działa to w systemach Linux, MacOSX i FreeBSD.

Stefan Lasiewski
źródło
GREP_OPTIONSnależy uznać za szkodliwe. Polecam aliaszamiast tego użyć . Zobacz tutaj: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Zgadzam się, że GREP_OPTIONS może stanowić problem w niektórych skryptach. Ale jak argumentowałem w błędzie 67141, GREP_OPTIONS pozwala użytkownikowi ustawić jedną opcję dla wielu form grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep itp.), Podczas gdy alias będzie musiał zostać ustawiony każda forma * grep, a istnieje wiele rodzajów grep.
Stefan Lasiewski
Używałem GREP_OPTIONS od lat (nie, dekady), ale szkoda, którą powoduje, jest bardzo realna. Wszelkie narzędzia, które wywołują grep z tym zestawem zmiennych env, odziedziczą zmodyfikowane domyślne zachowanie, a to spowoduje ich uszkodzenie. Unikaj tego problemu całkowicie, definiując zamiast tego alias lub wykonywalny skrypt opakowujący.
Jonathan Hartley,
Skrypty muszą zdezynfekować swoje środowisko. Niedozwolone są znaki „ale”, „ale”. Kropka. (Tak, to królewski ból w dolnej części pleców ...).
vonbrand,
3

Polecam unikanie zmiennej środowiskowej GREP_OPTIONS, wpłynie to na każde wywołanie grep, nawet tych osadzonych w innych narzędziach. Jeśli te narzędzia oczekują, że grep będzie się zachowywał w jeden sposób, a ty zmienisz to zachowanie, spowoduje to uszkodzenie narzędzi.

Zamiast tego możesz utworzyć alias, który działa dobrze. Wpłynie to tylko na wywołania grep z interaktywnej powłoki (tzn. Że sam piszesz).

Ostatnią opcją, która najbardziej mi się podoba, jest stworzenie skryptu otoki, który wywołuje grep. Wolę to od aliasu, ponieważ mogę wywoływać to opakowanie z innych programów. Np. W vimie, ustawiając vimgrep, dzięki czemu moje wyszukiwania w vimie zachowują się identycznie jak wyszukiwania w wierszu poleceń.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Wywołaj to, używając:

$ grp pattern dir

na przykład

$ grp pattern .

wyszuka wystąpienia „wzorca” we wszystkich plikach tekstowych w bieżącym katalogu i podkatalogach.

Zauważ, że nazywam mój skrypt „grp”, a nie cieniowanie „grep”, dzięki czemu zawsze mam świadomość, czy wywołuję grep z moimi niestandardowymi ustawieniami domyślnymi.

Domyślnie dołączam:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Myślę, że każdy chciałby pominąć katalog kontroli źródła: .hg .git .bzr .svn

Pomijanie „build” i „dist” to Python-isms i prawdopodobnie nie dotyczy większości ludzi. Bez wątpienia w trakcie pracy rozwiniesz swoje osobliwości.

„tags” to wynik ctagów, których używam do „przejdź do definicji funkcji” i tym podobnych w narzędziach takich jak vim. Jako taki zawiera co najmniej jedną kopię każdego słowa i symbolu z mojego kodu źródłowego, dlatego warto pomijać wyniki wyszukiwania.

„$ *” na końcu to składnia bash dla „i wszystkich innych parametrów z wiersza poleceń”, więc możesz przekazać wzorzec i katalog, aby szukać normalnie, i przesłonić wszelkie inne flagi linii poleceń .

Jonathan Hartley
źródło
2

--colorOpcja została już wspomniano kilka razy, ale chciałbym dodać, że jest to możliwe, aby zmienić kolor, w których mecze będą podświetlone za pomocą zmiennej środowiskowej

export GREP_COLOR="1;33"

Kolor należy zakodować za pomocą kodów kolorów ANSI, w celach informacyjnych

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37
Adam Byrtek
źródło
1
GREP_COLORjest przestarzałe. Użyj GREP_COLORSzamiast tego.
g33kz0r
2

Ponieważ nie widziałem żadnych przykładów ustawiania kolorów, oto prosta konfiguracja GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Uważaj na GREP_OPTIONS; nie używaj go do niczego innego niż coś takiego --color=auto, bo może to zepsuć wszystkie skrypty, które używają grep w twoim systemie.

docwhat
źródło