Как я могу выделить совпадения, используя 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

перечислит все pids процессов, которые соответствуют имени некоторого зависшего процесса, который вы можете использовать в следующей ситуации:

$ kill $(pgrep some-hanging-process)

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

1
С последними версиями GNU grep, grep -rкак правило , следует отдавать предпочтение перед тем, grep -Rкак первый не пересекает символические ссылки.
Стефан Шазелас

19

Я обнаружил, что лучший способ для pimp grep - это использовать ack , который по сути является рекурсивным grep с интеллектуальным списком игнорирования (например, не выполняет поиск в каталогах .svn, игнорирует файлы резервных копий и т. Д.), Выделяет цветом результаты и Perl регулярные выражения Это то, что вы хотите, чтобы grep делал 98,6% времени.


5
+1 за упоминание ack. Не забудьте включить параметр --pager = "less -R", чтобы поддерживать выделение для разбитых на страницы результатов. Также стоит упомянуть, что в Ubuntu его называют «ack-grep», так как «ack» используется.
Шон Чин

Я также использую ack, но иногда у вас его нет в наличии ...
elmarco

2
Поскольку ack - это всего лишь скрипт на Perl, вы можете сделать его доступным везде, где у вас установлен Perl, что не является высокой чертой.
Кай

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

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, унаследуют ваше измененное поведение по умолчанию, и это БУДЕТ сломать эти инструменты. Избегайте этой проблемы полностью путем определения псевдонима или исполняемого сценария оболочки вместо этого.
Джонатан Хартли

Скрипты должны дезинфицировать свою среду. Не разрешается, если, но или как. Период. (Да, это королевская боль в нижней части спины ...).
vonbrand

3

Я бы порекомендовал избегать переменной среды GREP_OPTIONS, это повлияет на каждый вызов grep, даже если он встроен в другие инструменты. Если эти инструменты ожидают, что grep будет вести себя одинаково, и вы измените это поведение, оно сломает эти инструменты.

Вместо этого вы можете создать псевдоним, который хорошо работает. Это повлияет только на вызовы 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 .

будет искать экземпляры '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-измы, и, вероятно, они не применимы к большинству людей. Без сомнения, вы будете развивать свои собственные особенности во время работы.

'tags' - это вывод 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.