Виділіть пошук результатів консолі, відображаючи при цьому весь командний вихід


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 тощо. Приємно!
Стефан Ласевський

Чи є якийсь спосіб уникнути набору тексту - кольоровий колір весь час? Я думаю, що це досить базове значення для вбудовування кольорового варіанту в греп, не впевнений, чому ми чітко вводимо кольори кожного разу. Я намагався створити сценарії, кажучи, що у файлах grepd є башти, що говорять grep --color $ 1 $ 2, але це не працює. Будь-який ключ тут виправити, будь ласка
Srujan Kumar Gulla

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

9

Мені подобається ак .

ack --passthru somepattern filename

Це як греп, але краще. Він виділяється за замовчуванням, а за допомогою --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

Ця версія не потребує захоплення дужок і може бути запущена 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

Першочергове не ноцере. вилучено.
Повсякденний кодер

GREP_OPTIONS використовується у багатьох формах grep(zgrep, bzgrep, bzfgrep тощо). Отже, якщо ви хочете, щоб усі форми grep поводилися послідовно, вам потрібно встановити псевдонім для кожної форми grep. Новий відповідь вище Casual не буде мати щось подібне bzgrep pattern /var/log/messages.?.gz, що є прикладом, коли виділення кольорів буде ДУЖЕ корисним.
Стефан Ласєвський

1

Є приємний інструмент для суперкарт , який саме відповідає цій цілі. Він може одночасно розфарбувати вихід консолі та створити "виділений" HTML з вашого вводу.


Дякую, це виглядає багатообіцяюче. Однак, напевно, я не можу змусити його працювати.
DerMike

1
Погляньте на його конфігураційні файли (в /etc/supercatUbuntu), які встановлюють правила забарвлення, вони в основному є кольоровими / повторними парами (з деякими додатковими правилами); Сторінка man також коротка і приємна.
Іван Тарасов

Я знайшов spcrcфайл синтаксису vim на vim.org/scripts/script.php?script_id=2676
DerMike
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.