Чтение из структурированного файла для вызова grep для совпадений

Вы можете использоватьbase64:

$ VAR="1/ 
,x"
$ echo "$VAR" | base64 > f
$ VAR=$(cat f | base64 -d)
$ echo "${VAR}X"
1/ 
,xX
-2
21.11.2021, 20:07
2 ответа

использовать подстановку процесса и передавать в цикл только строки с именами файлов (вместо всего файла)

while IFS= read -r fl; do
  grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < <(grep -o '/.*' "$logfl")

или обрабатывать весь файл, но пропуская строку за строкой до тех пор, пока не появится ключевое слово File:, затем обрабатывать строку за строкой с манипуляциями со строками /${fl#*/}, пока не исчезнет ключевое слово +, затем прекратить чтение

# some control flags
begin=
exit=continue

while IFS= read -r fl; do
  case ${fl%[[:blank:]]*} in
    *File:*)
      begin=start
    ;;
    *+*)
      exit=break
    ;;
    *)
      $exit
    ;;
  esac
  [ "$begin" ] && \
  grep --color -ni -C 8 -e "$ptrn" -- "/${fl#*/}"
done < "$logfl"
0
22.11.2021, 21:06

В комментариях к вопросу вы упомянули, что поместили эти данные в формат, читаемый набором инструментов GNU recutils.

Давайте воспользуемся этими инструментами для извлечения путей и вызоваgrep:

recsel -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}

Выбирает и печатает значения, связанные с полем Fileв файле с именем $logfl. Для каждой строки, созданной командой recsel, xargsвызывает grepдля извлечения строк, соответствующих основному регулярному выражению в $ptrn.

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

Если бы у вас был файл записи с несколькими полями Fileс отдельными значениями, вы бы вместо этого использовали

recsel -C -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}
1
22.11.2021, 17:06

Теги

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