grep: відобразити всі результати, але виділити результати пошуку


43

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

тестовий файл

hello
there
my
friends

командування

$ cat testfile | grep 'hello'
hello #this will be highlightd

це підкреслить відповідність пошуку та відобразить увесь рядок, на який він потрапляє. Я можу використовувати -Aта -Bвідображати рядки до і після цього рядка. Моє запитання: чи можна виконати команду і відобразити весь вихід як нормальний, але виділити пошукові збіги, як греп? тож мій вихід був би

hello #highlighted
there
my
friends

Відповіді:


38

Щоб використовувати кольоровий GREP лише для виділення відповідних шаблонів, але інакше не змінювати вихід:

grep --color=always -e "^" -e "hello" testfile

Перший шаблон буде відповідати всім рядкам (всі рядки будуть надруковані), другий візерунок (і будь-які наступні шаблони) спричиняють виділення відповідного тексту кольором.

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


Працює з kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"в zsh
Майкл Коул

Для використання в Bash: виділити () {grep --color = завжди -e "^" -e $ *; }
Джон

Це працює і на FreeBSD, вам потрібно просто поміняти перший і другий патерн ( "^"має бути другим).
Marián Černý

25

Додати опцію -zв команду grep GNU:

cat testfile | grep --color=always -z 'hello'

або коротше

grep --color=always -z 'hello' testfile

3
Це дуже сирий злом. Це спричинить трактування всього файлу як єдиного рядка. Таким чином, (1) , якщо файл дуже великий, може бути можливість запуску з пам'яті, і (2) , якщо файл не містить шаблон взагалі , то нічого не буде виводитися.
G-Man каже: "Відновіть Моніку"

На якій версії grep це підтримується? На grep 2.5.4, -z здається недоступним ...
Alex

@Alex: я використовував GNU grep версії 2.6.3.
Сайрус

2
@ G-Man: більше економії ресурсів:grep --color "hello\|$" file
Сайрус

@Cyrus: Так, це краща відповідь. На жаль, вона по суті еквівалентна відповіді bot779 на це питання і майже ідентична прийнятим відповідям ( 1 і 2 ) на питання, з якими я пов’язана.
G-Man каже: "Відновіть Моніку"

5

Як і в попередній відповіді, ви можете вловлювати всі $кінці рядків:

cat testfile | grep --color -E "hello|$"

-E(або --extended-regexp) означає, що потрібно уникати спеціальних символів \. При його використанні |буде розглядатися як регулярне вираження "АБО" стан.

Grep |$також буде ловити та друкувати всі рядки, які мають кінець, але оскільки $ є прихованим символом, його не можна виділити.

Оновлення:

Якщо ви хочете надрукувати весь вихід, але також повернути вихідний код , знайдено збіг чи ні, ви можете скористатися командою perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Якщо ви віддаєте перевагу sed - Ось приклад, як виділити всі збіги + повернути вихідний код, якщо не знайдено відповідності: https://askubuntu.com/a/1200851/670392


2

Цей працює як з GNU grep, так і з grep на FreeBSD:

grep --color=always 'hello\|$'

Він відповідає тексту "привіт" або ( \|) недрукованому нульовому рядку в кінці кожного рядка ( $). Тому кожен рядок друкується, але виділяється лише "привіт".

Швидше за все, ви вже --color=autoналаштувались у своїй оболонці. Тоді вам, швидше за все, не потрібно вказувати --color=always:

grep 'hello\|$'

Ви також можете спростити версію, використовуючи egrep(з розширеними регулярними виразами), де |для виразу "або" не потрібно уникати:

egrep 'hello|$'

Це не відповідає, як відобразити всі рядки введення.
Кріс Пейдж

@ChrisPage Я б сказав, що це так: Тому кожен рядок надруковано, але виділяється лише "привіт".
Marián Černý

0

Додавання до верхньої відповіді вище. Функція виділення {}, зазначена в коментарях, працює лише тоді, коли в неї вводяться дані. Наступний псевдонім, хоча і не ідеальний, є більш корисним:

alias greph="grep --color=always -e^ -e"

Це працює з такими командами, як:

greph foo bar.txt

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