Выделите результаты поиска в консоли, отображая весь вывод команды


19

Когда я использую, например, cat file.txt | grep --color=tty "pattern"я получаю выделенный шаблон поиска. Когда я хочу немного больше контекста вокруг каждого удара, Grep имеет -A, -Bи -Cпараметры.

Однако я хочу отобразить весь файл (или любой вывод команды) и выделить определенный шаблон. Существует ли такая команда или инструмент выделения?


Чем то, что вы хотите сделать сейчас, отличается от того, что вы уже делаете?
Бенджамин Банье

Ответы:


22

На unix.stackexchange.com был ответ, в котором был такой хитрый трюк:

grep -E --color 'pattern|$' file.txt

или

grep --color 'pattern\|$' file.txt

который соответствует вашему шаблону или концу строки в каждой строке. Только шаблон выделен.


+1 Простой и легко адаптируемый к zgrep, bzgrep и т. Д. Отлично!
Стефан Ласевский,

Есть ли какой-нибудь способ не печатать постоянно --color? Я думаю, что довольно просто встроить опцию цвета в grep, но не уверен, почему мы каждый раз явно вводим цвет. Я пытался создать сценарии, в которых у файлов grepd есть bash с выражением grep --color $ 1 $ 2, но он не работает. Любая подсказка, чтобы исправить это, пожалуйста
Srujan Kumar Gulla

1
@lordlupine: добавьте GREP_OPTIONS='--color'в свой ~/.bashrc(или измените настройку, чтобы включить --color). Вам нужно будет запустить новый терминал или выполнить это назначение в командной строке текущего терминала, чтобы оно вступило в силу.
Приостановлено до дальнейшего уведомления.

9

Мне нравится Ack .

ack --passthru somepattern filename

Это как grep, но лучше. По умолчанию он подсвечивается, а с помощью --passthruопции он показывает весь файл (или стандартный ввод) вместо только совпадающих строк.


1
Если вы пытаетесь перенаправить вывод в ack, например, из tail, то вам также нужно использовать эту --filterопцию. Например:tail -f myLogFile | ack --filter --passthru pattern
Воробей

5

Я также рекомендую использовать less(или такое), но я хочу показать вам более дидактическое решение. Как только вы определили эту функцию:

функция подсветки ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Вы можете использовать это так:

command | highlight pattern
highlight pattern file.txt

Примечание: Эта версия является чувствительным к регистру, чтобы изменить это просто добавить iпосле того, как gв sedвыражении.


1
Я бы вызвал tputвместо жесткого кодирования значений. Таким образом, вы также избегаете использования echo -e, которое может иметь другие эффекты.
Игнасио Васкес-Абрамс

Вы абсолютно правы, я искал это без удачи. Благодарю.
cYrus 13.10.10

Эта версия не нуждается в захвате скобок и может быть запущена с помощью prog | highlight "pattern"или highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
приостановлена ​​до дальнейшего уведомления.

Мои sedнавыки в основном не существуют. Как бы мне пришлось изменить это, чтобы соответствовать шаблону с учетом регистра. В любом случае, я добавлю это в мои функции bash_functions. Большое спасибо.
DerMike

@DerMike: Теперь он чувствителен к регистру.
cyrus

3

Переход -Cк grepдостаточно высокому значению сделает это.


Я мог бы поклясться, что получил что-то еще в прошлый раз, когда попробовал это. (Каждый соответствует контексту с разделителями «-----» между ними.) Теперь, когда вы сказали мне, он работает нормально :-) Спасибо.
DerMike

Он будет отделять каждый матч, если не хватает контекста.
Игнасио Васкес-Абрамс

3

less выделяет рисунок, так

less -p 'mypattern' file.txt

или

ridiculously | long | pipe | less

а затем меньше /искать шаблон, который будет выделен.

Примечание:

Вы можете улучшить свою команду, например,
установить псевдоним alias grep="grep --color=tty"и использовать ее так:

grep 'mypattern' file.txt;

1
Вы должны воздерживаться от использования GREP_OPTIONS, вместо этого использовать псевдоним. см .: bugs.launchpad.net/ubuntu/+bug/67141
lesmana 13.10.10

Primum non nocere. удален.
Казуальный кодер

GREP_OPTIONS используется многими формами grep(zgrep, bzgrep, bzfgrep и т. Д.). Таким образом, если вы хотите, чтобы все формы grep вели себя согласованно, вам необходимо установить псевдоним для каждой формы grep. Новый ответ @ Casual выше не bzgrep pattern /var/log/messages.?.gzподходит для чего-то подобного , это пример, где цветовая подсветка ОЧЕНЬ полезна.
Стефан Ласевский

1

Есть хороший инструмент SuperCat , который служит именно для этой цели. Он может как раскрасить вывод вашей консоли, так и создать «выделенный» HTML из вашего ввода.


Спасибо, это выглядит многообещающе. Тем не менее, я не могу заставить его работать в данный момент.
DerMike

1
Взгляните на его конфигурационные файлы (в /etc/supercatUbuntu), которые устанавливают правила раскраски, в основном это пары color / regexp (с некоторыми дополнительными правилами); Страница man также короткая и приятная.
Иван Тарасов

Я нашел spcrcфайл синтаксиса vim по адресу vim.org/scripts/script.php?script_id=2676
DerMike,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.