Цветной вывод grep с выделенным шаблоном

Чтобы сгенерировать 25 файлов, которые вы ищете...

$ find /lots/of/files | split -d -l 100000

Это создаст файлы по 100 000 строк в каждом. Есть еще несколько вещей, которые вы можете сделать с помощью split, так что загляните на справочную страницу. С -dони будут называться в цифрах, а не в алфавитном порядке -. как в x01, x02,...x25

Отсюда вы можете просмотреть файлы и запустить rsync.

for file in x*
do
   # Run rsync command using $file as the change list
done

ХТХ

1
23.01.2020, 19:47
2 ответа

1 )пример раскрашивания текста

# creation of 3 escape sequences
C_1=$(echo -ne "\033[30;47m" ) ;
C_2=$(echo -ne "\033[32;41m" ) ;
C_3=$(echo -ne "\033[37;44m" ) ;
C_N=$(echo -ne "\033[0m"  )  ;

#simple example for using it
echo $C_1 Hello in C_1 $C_N normal ;
echo $C_2 Hello in C_2 $C_N normal ;
echo $C_3 Hello in C_3 $C_N normal ;

Объяснение значений здесь :https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit

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

PAT="tot" ; 
find./ -iname  \*$PAT\*  -printf '%P\n' | \
    sed "s/^\(.*\/\)\{0,1\}\([^\/]*\)\($PAT\)\([^\/]*\)\$/${C_1}\1${C_2}\2${C_3}\3${C_N}\4/i"

\1 is the full path ending with the last /
\2 is the pattern of the filename before the pattern
\3 is the pattern
\4 is after the pattern
0
27.01.2020, 23:29

Вы можете сделать это с помощью zshвстроенных операторов glob. Это имело бы несколько преимуществ:

  • легко решить эту проблему
  • работать с путями, содержащими символы новой строки
  • упростить выделение паттерна только в базовом имени
  • работать с подстановочными знаками (в вашем подходе, findи grepинтерпретировать шаблон по-разному)
  • получить отсортированный список
  • работают даже на не -системах GNU (-printf, -iname, --colorне являются -стандартными расширениями ).

Может быть, что-то вроде:

#! /bin/zsh -
pattern="(#i)${1?Please specify a pattern}"

set -o extendedglob

typeset -A find_file_color
find_file_color=(
  dirname  $'\e[0;33;49m'
  basename $'\e[1;34;49m'
  match    $'\e[1;33;44m'
  reset    $'\e[m'
)

colorize_file() {
  local file=${1-$REPLY}
  case $file in
    (*/*)
      REPLY=$find_file_color[dirname]$file:h$find_file_color[reset]/;;
    (*)
      REPLY=
  esac
  REPLY+=$find_file_color[basename]${${file:t}//(#m)$~pattern/$find_file_color[match]$MATCH$find_file_color[basename]}$find_file_color[reset]
}

print -rC1 -- **/*$~pattern*(ND.+colorize_file)

Обратите внимание, что он строит и сортирует весь список перед передачей в printдля печати. Таким образом, вы начнете получать некоторый вывод только после того, как все файлы будут найдены. Чтобы распечатать их по мере их нахождения (, но тогда нам пришлось бы отказаться от сортировки ), вместо этого вы могли бы использовать функцию квалификатора glob для печати раскрашенного файла:

#! /bin/zsh -
pattern="(#i)${1?Please specify a pattern}"

set -o extendedglob

typeset -A find_file_color
find_file_color=(
  dirname  $'\e[0;33;49m'
  basename $'\e[1;34;49m'
  match    $'\e[1;33;44m'
  reset    $'\e[m'
)

colorize_file() {
  local file=${1-$REPLY}
  case $file in
    (*/*)
      REPLY=$find_file_color[dirname]$file:h$find_file_color[reset]/;;
    (*)
      REPLY=
  esac
  REPLY+=$find_file_color[basename]${${file:t}//(#m)$~pattern/$find_file_color[match]$MATCH$find_file_color[basename]}$find_file_color[reset]
  print -r -- $REPLY
  false # don't bother adding the file to the glob expansion
}

: **/*$~pattern*(ND.+colorize_file)
1
27.01.2020, 23:29

Теги

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