Як я можу виділити сірники за допомогою GNU grep?


18

Я бачив на деяких Linux, які grepналаштовані на виділення відповідності та друк відповідного файлу.

Як я можу налаштувати grepвиділення збігів?

Відповіді:


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

Використання:

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

Також один із моїх улюблених:

$ pgrep some-hanging-process

перерахує всі підручники процесів, які відповідають імені якогось висячого процесу, який ви можете використовувати в наступній ситуації:

$ kill $(pgrep some-hanging-process)

12
є команда pkill для останнього
diega

1
З останніми версіями GNU grep, grep -rяк правило, слід віддавати перевагу над попередніми, grep -Rоскільки перша не перетинає символьні посилання.
Стефан Шазелас

19

Я виявив, що найкращим способом сутенера grep є використання ack , який по суті є рекурсивним grep із інтелектуальним списком ігнорування (наприклад, не шукає .svn каталогів, ігнорує резервні файли тощо), кольоровим виділенням результатів та пергельгепс. Це те, що ви хочете, щоб греп робив 98,6% часу.


5
+1 за згадку про ack. Не забудьте включити параметр --pager = "менше -R", щоб підтримувати підсвічування збережених результатів. Можна також згадати, що в Ubuntu його називають "ack-grep", оскільки "Ack" прийнято.
Шон Чін

Я також використовую ack, але колись у вас його немає в наявності ..
elmarco

2
Оскільки ack - це лише сценарій perl, ви можете зробити його доступним у будь-якому місці, на якому встановлено perl, що не є високим рівнем.
Кай

Ack корисний тим, що він за замовчуванням нестандартний, але в той час, як вам знадобиться встановити ack, ви могли налаштувати деякі параметри за замовчуванням для grep - дивіться мою відповідь в іншому місці на цій сторінці. Я робив це один раз у 1980-х, і з тих пір греп зробив усе, що робить. (тільки греп насправді швидший, незважаючи на гучні претензії Акка до протилежного)
Джонатан Хартлі

7

Я встановив це у своєму .bashrc, замість того, щоб переглядати grep, використовуючи псевдонім:

    export GREP_OPTIONS="--color=auto"

Для мене це працює на Linux, MacOSX та FreeBSD.


GREP_OPTIONSслід вважати шкідливим. Я рекомендую використовувати aliasзамість цього. Дивіться тут: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Я погоджуюся, що GREP_OPTIONS може бути проблемою в певних сценаріях. Але, як я заперечував у помилці 67141 , GREP_OPTIONS дозволяє користувачеві встановити один варіант для багатьох форм grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep тощо), тоді як псевдонім потрібно встановити для кожна форма * grep, і існує багато типів grep.
Стефан Ласєвський

Я використовував GREP_OPTIONS роками (най, десятиліттями), але шкода, яку він завдає, дуже реальна. Будь-які інструменти, які викликають grep за допомогою цього набору env var, успадкують вашу модифіковану поведінку за замовчуванням, і ЦІ засоби будуть порушені. Уникайте цієї проблеми повністю, встановивши натомість псевдонім або виконуваний скрипт обгортки.
Джонатан Хартлі

Сценарії повинні санітувати своє оточення. Не дозволяється ніколи, але і кочення. Період. (Так, це королівський біль у попереку ...).
фонбранд

3

Я рекомендую уникати змінної середовища GREP_OPTIONS, це вплине на кожен виклик grep, навіть на вбудовані в інші інструменти. Якщо ці інструменти очікують, що греп поводитиметься в один бік, а ви змінюєте таку поведінку, він буде і порушує ці засоби.

Натомість ви можете створити псевдонім, який добре працює. Це вплине лише на дзвінки з видаленням з інтерактивної оболонки (тобто, що ви самі вводите).

Останнім варіантом, який мені найбільше подобається, є створення сценарію обгортки, який викликає grep. Я віддаю перевагу цьому над псевдонімом, тому що я можу викликати цю обгортку з інших програм. Наприклад, vim, встановивши vimgrep, щоб мої пошуки зсередини vim поводилися однаково з пошуками в командному рядку.

$ 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 $*

Закликайте це, використовуючи:

$ grp pattern dir

напр

$ grp pattern .

буде шукати екземпляри "шаблону" у всіх текстових файлах у поточному редакторі та підкаталогах.

Зауважте, що я називаю свій скрипт "grp", а не затіненням "grep", так що я завжди усвідомлюю, я посилаюсь на grep за допомогою своїх налаштованих налаштувань чи ні.

За замовчуванням я включаю:

-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

Я думаю, кожен хотів би пропустити джерела управління джерелами: .hg .git .bzr .svn

Пропуск "build" та "dist" - це Python-isms, і, ймовірно, не стосується більшості людей. Без сумніву, ви будете розвивати власні ідіосинкразії під час роботи.

'теги' - це вихід ctags, який я використовую для 'переходу до визначення функції' тощо. в таких інструментах, як vim. Як такий, він містить принаймні одну копію кожного слова та символу з мого вихідного коду, тому його варто пропустити з результатів пошуку.

"$ *" в кінці - це синтаксис bash для "та всіх інших парам з командного рядка", тож ви можете перейти до шаблону та dir для пошуку як звичайного та замінити будь-які інші прапори командного рядка, які ви хочете .


2

Цей --colorпараметр вже згадувався кілька разів, але я хочу додати, що можна налаштувати колір, у якому відповідність буде виділятися за допомогою змінної середовища

export GREP_COLOR="1;33"

Колір повинен бути закодований за допомогою ANSI кольорів, для довідки

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_COLORзастаріло. Використовуйте GREP_COLORSзамість цього.
g33kz0r

2

Оскільки я не бачив прикладів насправді встановлення кольорів, ось проста установка для 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

Будьте уважні GREP_OPTIONS; не використовуйте його для чогось іншого, крім подібних речей, --color=autoабо це зіпсує будь-які сценарії, які використовують grep у вашій системі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.