TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #443 11.6K
Здрасти. Наш товарищ 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)


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

В общем, можно быстро получить список телефонов любого филиала, отдела, именинников в этом месяце... Или забить примеры кода и получить справочник для студентов/админов по конструкциям 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"


tags: #bash
—
🔔 @bashdays
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →