Как изменить цвет символа при конце и TR

От dd(1):

bs=BYTES

/.../

БЛОКИ и БАЙТЫ могут сопровождаться следующими мультипликативными суффиксами: c =1, w =2, b =512, КБ =1000, K =1024, МБ =1000*1000, M =1024*1024

С другой стороны, если у Вас есть последняя версия удара, {} конструкция также предпринимает шаги параметр:

for i in {10000..100000..1000}; do dd if=/dev/zero of=testfile$i bs=$i count=1 ; done
3
06.09.2013, 19:28
4 ответа

Я не думаю, что Вы можете с tr потому что заменяющий набор является усеченным к длине набора соответствия, и изменяющий цвет требует некоторых управляющих символов.

Не невозможный с sed tho:

tail -f file.log  | sed s/\001/\\x1b[32m\|\\x1b[0m/g

1b шестнадцатеричное число для восьмеричного 33, часто замеченный в вещах как цветные подсказки, потому что оболочке нравится восьмеричный (но передать "непечатные" управляющие символы sed, используйте шестнадцатеричное число). Например, чтобы просто распечатать зеленую панель:

echo -e "\033[32m|\033[0m"

Управляющие последовательности являются "escape-последовательностями ANSI", видят здесь для деталей (32, зеленый передний план, 0 сбрасывается). Восьмеричные 33 = десятичные 27 = символ 'ESC' ASCII, следовательно "escape-последовательность".

4
27.01.2020, 21:09
  • 1
    Что делает стенд для в sed s/a/...? –  netigger 20.01.2016, 11:20
  • 2
    @DavidEverlöf Хороший вопрос... Я предполагаю, что означал объяснять что как безотносительно символа (как в "замене с b")??? Но OP получил его так, я никогда не замечал. Так или иначе я заменил это \001 соответствовать вопросу. –  goldilocks 20.01.2016, 11:31
  • 3
    Неудивительный я ничего не нашел о нигде =) Хорошо, спасибо. поиск –  netigger 21.01.2016, 09:57
tail -f file.log  | sed -n '/TEST/s/\x1/\x1b[32m|\x1b[0m/gp'
  • -n скажите sed подавлять вывод по умолчанию (но финал p скажет для печати подобранных строк, своего рода grep),
  • /TEST/ выбор только выравнивает, которые соответствуют (как grep)
  • s заменять \x1 (\x Escape оболочки для шестнадцатеричных значений) с \x1b[32m|\x1b[0m.
    • \x1b[ запустите управляющий код ANSI
    • 32 цветной зеленый для приоритетного текста
    • \x1b[0m сбросьте основной цвет
    • g для глобального, замена очень возникновение

Можно установить его в Вашем .bashrc как функция (не протестированный)

loggrep() {
   sed -n "/$1/s/\x1/\x1b[32m|\x1b[0m/gp"
}
4
27.01.2020, 21:09
  • 1
    Вы - слишком быстрый :) –  Alex 06.09.2013, 19:42
  • 2
    , из которого я пошел бы с более портативной версией: tail -f file.log | sed -n '/TEST/ "s/\x1/$(tput setaf 2)|$(tput sgr0)/gp", который получит соответствующий код для Вашего типа термина для "зеленого" и –  Drav Sloan 06.09.2013, 19:54

Я не вижу, как Ваша команда может работать с тех пор (по крайней мере, в моей системе) tail -f не может быть передан по каналу дважды начиная со второй программы Вы передаете по каналу к (grep в Вашем случае), ожидает, пока вход не закончился прежде, чем распечатать результаты.

Так или иначе стандартный метод - то, что предложенный лютик золотистый, с помощью ANSI выходят из цветных последовательностей. Так как я делаю это очень часто, я записал немного сценария, который окрасит любую строку, которую Вы даете ему:

#!/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_magenta', 
           'bright_white on_red', '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=<>) 
{ 
    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;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
        }
      }
    }
    print STDOUT $line;
}

Если Вы сохраняете его как color в каталоге, который находится в Вашем $PATH и сделайте это исполняемым файлом (chmod +x/usr/bin/color), можно окрасить строки из журнала ошибок как это:

tr '\001' '|' < file.log | color -l "\|" 

Как записано, сценарий предопределил цвета для 10 различных шаблонов, таким образом давая ему список разделенных запятой значений, как я имею в примере выше, окрасит каждый из шаблонов подобранным в различном цвете.

2
27.01.2020, 21:09

К colorize | символ, канал к

sed -e "s/\|/$(tput setaf 2)\\0$(tput sgr0)/g"

Терминальные возможности setaf и sgr0 упоминаются в terminfo(5).

1
27.01.2020, 21:09

Теги

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