Chcę kolorowe wyjście grep
.
.... Ale
- Strategia 1: GREP_OPTIONS. Ale to jest przestarzałe. Zobacz http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- Stragegy 2: GREP_COLORS na pierwszy rzut oka wyglądają jak rozwiązanie, ale robi to coś innego.
- Strategia 3: alias. To nie działa
find ... | xargs grep
, ponieważ xargs nie ocenia aliasów. - Strategia 4: Napisz prosty skrypt opakowania. Nie, myślę, że jest to zbyt brudne i sprawia więcej problemów niż rozwiązuje.
- Strategia 5: załóż kod źródłowy
- Strategia 6: Skontaktuj się z programistami grep, poproś o zastąpienie GREP_OPTIONS
- Strategia ŁADNE i ŁATWE: ... tego brakuje. Nie mam pojęcia.
Jak to rozwiązać?
Dziękujemy za próbę pomocy!
... ale nie mogę dać nagrody
Nazywaj mnie niegrzecznym, aroganckim, obraźliwym, obraźliwym ...
Widzę tylko obejścia - bez rozwiązania. Żadna odpowiedź nie zadawała pytania.
Dziękuję za Twój wysiłek.
color_option
na2
...--color
Opcja ma już wartośćauto
. Po prostu nie wiem, dlaczego nie możesz go aktywować domyślnie.exec grep --color=auto "$@"
), opcjonalnie o innej nazwie (grepc
lubcolorgrep
). Ma to nieistotny narzut (i brak dodatkowych współbieżnych procesów w czasie wykonywania). Powodem, dla którego określiłeś je jako „niełatwe”, jest to, że nie widzisz tej funkcji na tyle przydatnej, by poświęcić (stosunkowo mało) jednorazowego wysiłku na jej wdrożenie, i szukasz kogoś, kto zrobiłby to za Ciebie. Z tego powodu twoje komentarze „nie do końca ” na opublikowane odpowiedzi są dość niegrzeczne.Odpowiedzi:
Niektóre z powodów, dla których OP stwierdził, że opcje są nieodpowiednie, nie mają podstaw w rzeczywistości. Tutaj pokazuję, jakie efekty ma strategia OP 4:
W większości dystrybucji
grep
jest instalowany w/bin
(typowy) lub/usr/bin
(OpenSUSE, może inne) i domyślniePATH
zawiera/usr/local/bin
przed/bin
lub/usr/bin
. Oznacza to, że jeśli tworzysz za/usr/local/bin/grep
pomocągdzie
/bin/sh
jest powłoka kompatybilna z POSIX dostarczana przez twoją dystrybucję, zwykle bash lub dash. Jeśligrep
jest/usr/bin
, to zrób toNarzut tego skryptu jest minimalny. Te
exec
środki oświadczenie, że interpreter skryptu jest zastąpione przezgrep
binarnej; oznacza to, że powłoka nie pozostaje w pamięci podczasgrep
wykonywania. Zatem jedynym narzutem jest jedno dodatkowe wykonanie interpretera skryptu, tj. Małe opóźnienie w czasie zegara ściennego. Opóźnienie jest mniej więcej stała (zależy tylko od tego, czygrep
ish
już są w pamięci podręcznej stron, czy nie, i na ile I / O przepustowość jest dostępna), a nie zależy od tego, jak długogrep
będzie wykonywał lub jak dużo danych przetwarza.Jak długo to opóźnienie, tj. Narzut dodany przez skrypt opakowania?
Aby się dowiedzieć, utwórz powyższy skrypt i uruchom
Na mojej maszynie pierwsza trwa 0,005 s w czasie rzeczywistym (w dużej liczbie przebiegów), podczas gdy druga trwa 0,006 s w czasie rzeczywistym. W związku z tym narzut związany z użyciem opakowania na mojej maszynie wynosi 0,001 s (lub mniej) na wywołanie.
To jest nieistotne.
Nie widzę też w tym nic „brudnego”, ponieważ wiele popularnych aplikacji i narzędzi używa tego samego podejścia. Aby zobaczyć listę takich na swoim komputerze w
/bin
i/usr/bin
, po prostu uruchomNa moim komputerze, powyższy wyjściowy zawiera
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
, ixfig
, którego używam dość często. Jeśli nie uważasz całej dystrybucji za „brudną” za poleganie na skryptach opakowujących, nie masz powodu, aby uważać takie skrypty opakowujące za „brudne”.Jeśli chodzi o problemy, taki skrypt opakowania może powodować:
Jeśli tylko użytkownicy człowieka (w przeciwieństwie do skryptów) używasz wersji grep że domyślnie wsparcia koloru jeśli wyjście jest do terminala, a następnie skrypt banderola może być nazwany
colorgrep
lubcgrep
czy cokolwiek PO uważa za stosowne.Pozwala to uniknąć wszystkich możliwych problemów ze zgodnością, ponieważ zachowanie
grep
się nie zmienia.Włączanie
grep
opcji za pomocą skryptu opakowania, ale w sposób pozwalający uniknąć nowych problemów:Możemy łatwo przepisać skrypt opakowania, aby obsługiwał niestandardowy,
GREP_OPTS
nawet jeśliGREP_OPTIONS
nie był obsługiwany (ponieważ jest już przestarzały). W ten sposób użytkownicy mogą po prostu dodaćexport "GREP_OPTIONS=--color=auto"
lub podobny profil./usr/local/bin/grep
jest wtedyZauważ, że nie ma żadnych cudzysłowów
$GREP_OPTIONS
, więc użytkownicy mogą określić więcej niż jedną opcję.W moim systemie wykonywanie
time /usr/local/bin/grep --version
zGREP_OPTIONS
pustym lub zGREP_OPTIONS=--color=auto
jest tak samo szybkie, jak poprzednia wersja skryptu opakowania; tzn. zwykle zajmuje jedną milisekundę dłużej niż zwykłygrep
.Ta ostatnia wersja jest tą, którą osobiście polecam do użytku.
Podsumowując, strategia OP 4:
jest zalecany przez
grep
programistówjest prosty do wdrożenia (dwie linie)
ma nieznaczny narzut (dodatkowe milisekundowe opóźnienie na wywołanie na tym konkretnym laptopie; łatwe do zweryfikowania na każdym komputerze)
może być zaimplementowany jako skrypt otoki, który dodaje
GREP_OPTS
obsługę (zastępuje przestarzałe / nieobsługiwaneGREP_OPTIONS
)można zaimplementować (jako
colorgrep
/cgrep
), co nie wpływa na skrypty ani istniejących użytkownikówPonieważ jest to technika, która jest już powszechnie stosowana w dystrybucjach Linuksa, jest to technika powszechna, a nie „brudna”.
Jeśli zostanie zaimplementowany jako osobne opakowanie (
colorgrep
/cgrep
), nie może tworzyć nowych problemów, ponieważ w ogóle nie wpływa nagrep
zachowanie. Jeśli zostanie zaimplementowany jako skrypt otoki, który dodajeGREP_OPTS
obsługę, użycieGREP_OPTS=--color=auto
ma dokładnie takie samo ryzyko (problemy z istniejącymi skryptami), jak w przypadku dodawania domyślnego--color=auto
. Zatem komentarz, że „stwarza więcej problemów niż rozwiązuje” jest całkowicie niepoprawny: nie powstają dodatkowe problemy.źródło
Dokumentacja dostarczona z pierwszą strategią mówi:
Jeśli więc alias jest dla Ciebie niemożliwy, skrypt opakowania jest jedynym sposobem.
źródło
Powodem
GREP_OPTIONS
zmienna jest przestarzała jest to, że ma tendencję do problemów Bo kiedygrep
nazywa się gdzieś w skrypcie i skrypt nie działa z alternatywnych opcji, które pochodzą ze zmiennej. Jeśli napiszesz skrypt opakowaniagrep
, masz ten sam problem, chyba że nadasz mu inną nazwę .Możesz też zapisać swoje ulubione opcje w zmiennej. W powłokach innych niż zsh jest to uciążliwe, jeśli opcje zawierają znaki wieloznaczne (
\[*?
), ale w przeciwnym razie możesz po prostu użyć zmiennej bez cudzysłowu, aby uzyskać polecenie z argumentami.Zauważ, że GNU i BSD grep mogą rekurencyjnie przetwarzać drzewo katalogów, co eliminuje potrzebę
find
w połączeniu zgrep
większością czasu.źródło
grep
podobnym zachowaniu , potrzebujesz komendy o innej nazwie, lub jeśli zachowasz tę samą nazwę, złamiesz skrypty, które oczekują oryginalnego / standardowego zachowania. To jest najczystsze i nie powoduje dodatkowych problemów .Najłatwiej jest użyć aliasu (strategia 3). Jeśli naprawdę zależy ci na
xargs
poleceniu, możesz go zastąpić za pomocą funkcji bash.Nie jest to jednak lepsze niż użycie polecenia otoki, które wydaje się być zalecanym przez
grep
zespół rozwiązaniem :Moim skromnym zdaniem powinieneś skontaktować się z
grep
zespołem programistów, aby poprosić ich o prostą zamianęGREP_OPTIONS
zmiennej, która umożliwi kolorgrep
zgodnie z pewną zmienną środowiskową.Byłoby dla nich dość proste, aby domyślnie włączyć
color
opcję lub kiedyGREP_COLORS
została ustawiona.źródło
Oto rozwiązanie z górnej odpowiedzi @NominalAnimal, ale ze zwykłymi
grep: ...
ostrzeżeniami (zamiast/bin/grep: ...
):źródło