Здрасти. Наш товарищ Tagd Tagd написал для канала еще одну статейку, ловите. Предыдущая была тут. В остальном оставляйте свой фидбек в комментах.

spr.sh

Решил написать справочник. Получился консольный гугл для бедных. Консольный справочник для поиска инфы по тегам.

В ТЭГАХ КОНФИГА ИСПОЛЬЗОВАТЬ СИМВОЛ ПОДЧЕРКИВАНИЯ "_" НЕЖЕЛАТЕЛЬНО.

Вся инфа хранится в конфигурационном файле в виде:

# spb director ivanov ivan petrovich may
Иванов Иван Петрович
tel 123456789 director@mail.ru
ats 12587
loip 10.10.18.07
birth 22.05.1956
https://ya.ru
# bash if then else fi
declare -i $COND=0
if [[ "$COND" -eq 1 ]];then
  echo "FALSE"
else
  echo "TRUE"
fi

Набираем spr.sh regexp mail и получаем все записи, содержащие эти оба тэга. Порядок не важен.

При поиске можно использовать "_" для уточнения.

spr.sh bcd   = вхождение bcd (найдет bcd, abcd, bcde, abcde)
spr.sh _bcd  = начинается на bcd (найдет _bcd, _bcde)
spr.sh bcd_  = заканчивается на bcd (найдет bcd, abcd)
spr.sh _bcd_ = строго bcd (найдет bcd)

Обращаю внимание, поиск только по ВХОЖДЕНИЮ тэгов, но не комментов.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
В общем, можно быстро получить список телефонов любого филиала, отдела, именинников в этом месяце… Или забить примеры кода и получить справочник для студентов/админов по конструкциям bash sed awk grep regexp в одном флаконе.

Если нужно что-то поправить: spr.sh edit и конфигурашка открывается в редакторе. Этот режим можно использовать для поиска средствами редактора по всему конфигу, включая комменты.

Описание скрипта:

EDITOR - в каком редакторе открывать конфиг (vim mcedit)
CONF - имя конфига получаем из текущего имени скрипта.
$# -eq 0 - если нет параметров - выводим help.
${0##*/} - bash-аналог basename
eval "$(which $EDITOR) $CONF" ищем редактор и открываем конфиг

Далее awk.

Передавать $* (параметры скрипта) внутрь через переменную не стал, сразу встроил в однострочник (да-да. это однострочник)

BEGIN{split("'"$*"'",s," ")} до начала чтения файла разбиваем тэги по разделителю " " и записываем в массив s. обработка строк файла: ($0 ~ /^#/)

Для строк, начинающихся с символа # (тэг-строка)

k0=$0 - сохраняем строку тэгов на время поиска.
gsub(/^#/, "# ") - добавляем пробел после #

Теперь поле №1

for(i=2;i<=NF;i++){$i="_" $i "_"} обрамляем тэги "_" для более удобного поиска.

p=1 и проверяем в цикле наличие КАЖДОГО тэга во всей строке.

($0 !~ s[i]) Если искомого тэга в строке нет, p=0 и выход из цикла.

$0=k0 - восстанавливаем строку тэгов.

Если p=1 - (флаг печати) выводим строки.

Обращаю внимание, изменение переменной p только в тэг-строках

Использовать для хранения учетных данных нежелательно. Для этого есть KeePassXC и аналоги.

#!/bin/bash
declare -r EDITOR=nano
declare -r CONF=${0%.*}.conf
declare -r SCR=${0##*/}
if [[ $# -eq 0 ]];then
  echo "Search by tag1 && tag2 && ... in $CONF"
  echo "Usage: $SCR tag1 [tag2 ...[tagN]]"
  echo "Example:"
  echo "$SCR bcd ~> (seek bcd, abcd, bcde, abcde)"
  echo "$SCR _bcd ~> (seek bcd, bcde)"
  echo "$SCR bcd_ ~> (seek bcd, abcd)"
  echo "$SCR _bcd_ ~> (seek bcd)"
  echo
  echo "To edit conf: $SCR edit"
  exit
fi
if [[ "$1" == "edit" ]];then
  eval "$(which $EDITOR) $CONF"
  exit
fi
awk 'BEGIN{split("'"$*"'",s," ")}
{if($0 ~ /^#/){
   k0=$0
   gsub(/^#/, "# ")
   for(i=2;i<=NF;i++){
     $i="_" $i "_"}
   p=1
   for(i in s){
     if($0 !~ s[i]){
       p=0
       break}}
   $0=k0}
 if(p){print}
}' "$CONF"