Разноцветный Grep

Буфер обмена является ничем специальным и просто деталью реализации для некоторых программ, например. X, Emacs, Vim и другие программы имеют реализации, что Вы могли назвать "буферами обмена".

Поскольку Вы говорите о сервере, я предполагаю, что Ваши пользователи входят в систему в систему через ssh. Это означает, что нет никакого буфера обмена для этих пользователей. Это обрабатывается их хост-системой и terminal.

Если Вы хотите получить доступ X буфер обмена там является несколькими решениями, например:

  • xclip - интерфейс командной строки для буфера обмена
  • clipit - менеджер по буферу обмена без зависимостей к другим настольным средам

Если Вы хотите получить доступ X содержание буфера обмена для другого пользователя, необходимо получить доступ X сессия для этого пользователя.

Существует много других вещей, которые можно изучить, например, autocutsel, интеграция между X буферами обмена и Emacs, и т.д.

30
13.04.2017, 15:36
3 ответа

Вот другой подход. У меня есть немного сценария Perl, который я уже отправил в другом ответе, который выделит пользователя, предоставленного шаблонам в различных цветах. Немного измененная версия сценария будет действовать как grep:

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

EoF
      exit(0);
    }

my $case_sensitive=$opts{i}||undef;
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
       'bold magenta', 'bold cyan', 'yellow on_blue', 
       'bright_white on_yellow', 'bright_yellow on_red', 'white on_black');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    my $want=0;
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
           $want++;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
          $want++;
        }
      }
    }
print STDOUT $line if $want>0;
}

Если Вы сохраняете тот сценарий как cgrep где-нибудь в Вашем PATH и сделайте это исполняемым файлом, можно указать до 10 различных шаблонов, каждый из которых будет распечатан в различном цвете:

enter image description here

$ cgrep -h
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;
6
27.01.2020, 19:38

Каждый вызов grep в выполнениях канала в отдельной оболочке, таким образом, необходимо будет передать некоторое состояние между ними. Следующим решением является сырой способ обработать это с файлом, который сохраняет индекс цвета и файл блокировки, который гарантирует, чтобы одновременные вызовы не читали то же значение:

#!/usr/bin/env bash
color_index_file=~/.gitcolor
color_index_lock_file=/tmp/$(basename $0)

colors=()
for index in {31..34}
do
    colors+=("01;$index")
done

until mkdir "$color_index_lock_file" 2>/dev/null
do
    :
done

color_index=$(($(cat "$color_index_file" || echo 0) + 1))

if [[ $color_index -ge ${#colors[@]} ]]
then
    color_index=0
fi

printf "$color_index" > "$color_index_file"
rmdir "$color_index_lock_file"

GREP_COLORS="mt=01;${colors[$color_index]}" grep --color=always "$@"

Тест, принимающий, Вы назвали свою копию cgrep и поставленный это Ваш PATH:

echo foobarbaz | cgrep foo | cgrep bar | cgrep baz
5
27.01.2020, 19:38
  • 1
    единственные переменные, которые действительно должны сохраняться, COLOR_INDEX и GREP_COLORS. Я пытался экспортировать их в конце функции без успеха. Это то, что Вы имели в виду? Просто иметь export VAR, право? –  Lix 09.12.2013, 14:47
  • 2
    О - и да.. глупая опечатка там с COLOR_TOGGLE. Спасибо за ловлю его :) –  Lix 09.12.2013, 14:47
  • 3
    @l0b0 экспорт не работает на меня также, имеет к downvote на данный момент, пока он действительно не отвечает на вопрос. –  Bernhard 09.12.2013, 14:55
  • 4
    @Bernhard Делает эту работу для Вас? –  l0b0 09.12.2013, 22:16
  • 5
    Спасибо за Ваш вход! Я включил Ваш grep "$@" предложение - который разобрался в псевдониме для выполнения функции и затем grep. –  Lix 10.12.2013, 01:01

Если Вы хороши с регулярными выражениями, можно хотеть проверить grc, и grcat. grc называет grcat.

grcat использует конфигурационные файлы, где можно добавить регулярные выражения для соответствия тексту, который будет отображен в каждом цвете. Это также имеет много других опций. Это принимает значение по умолчанию к системным файлам журнала колоризации.

В зависимости от того, что Вы имеете в виду для своего заключительного сценария, Вы можете к colorize свой вывод со всего одной командой.

Прием указывает regexes правильно для каждого "поля" в Вашем источнике данных. Это будет намного легче, если Ваши данные будут относительно универсальны в структуре.

В прошлый раз, когда я попробовал его, я не стал слишком далеким, но я могу сделать, чтобы другие пошли в нем, потому что я немного лучше в regexes, чем я был затем.

Существует также команда tput, которая может использоваться для отправки информации (как цветные изменения) непосредственно к оконечному устройству.

Оба подхода охвачены сообщением ниже. Это говорит о команде находки, но это может быть применено к выводу любой команды.

Окрашенный НАХОДЯТ вывод?

1
27.01.2020, 19:38

Теги

Похожие вопросы