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?

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)

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.


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.


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ń .


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.