LogNotes

2025-07-25 19:02:35
#ok
#!/bin/bash

show_help() {
  cat <<EOF
Использование: $0 -f input_file "слово1 слово2 ..."

Ищет секции в файле (каждая начинается строкой [...]), 
выводит только те, где встречаются все указанные слова как полные слова (без учёта регистра).

EOF
}

while getopts ":f:h" opt; do
  case $opt in
    f) input_file="$OPTARG" ;;
    h) show_help; exit 0 ;;
    \?) echo "Неизвестная опция -$OPTARG" >&2; show_help; exit 1 ;;
    :) echo "Опция -$OPTARG требует аргумент" >&2; show_help; exit 1 ;;
  esac
done

shift $((OPTIND-1))

search_words="$1"

if [[ -z "$input_file" || -z "$search_words" ]]; then
  echo "Ошибка: укажите входной файл (-f) и слова для поиска."
  show_help
  exit 1
fi

if [[ ! -f "$input_file" ]]; then
  echo "Ошибка: файл '$input_file' не найден."
  exit 2
fi

awk -v words="$search_words" '
  function check_words_in_section(section, words_array, len,    i, word, pattern) {
    section_l = tolower(section)
    for (i = 1; i <= len; i++) {
      word = tolower(words_array[i])
      pattern = "(^|[^[:alnum:]_])" word "([^[:alnum:]_]|$)"
      if (section_l !~ pattern) return 0
    }
    return 1
  }

  BEGIN {
    len = split(words, search_words, " ")
    section = ""
    in_section = 0
  }

  /^\[.*\]$/ {
    if (in_section && check_words_in_section(section, search_words, len)) print section
    section = $0 "\n"
    in_section = 1
    next
  }

  {
    if (in_section) section = section $0 "\n"
  }

  END {
    if (in_section && check_words_in_section(section, search_words, len)) print section
  }
' "$input_file"
← Previous Next →
Back to list