Задать вопрос
Ответы пользователя по тегу bash
  • Почему один регэксп работает, а второй нет?

    hint000
    @hint000
    у админа три руки
    Гугл отвечает:
    Обзор от ИИ
    Within a regular expression character class [], the hyphen - has a special meaning when it is placed between two other characters, where it denotes a range of characters (e.g., [a-z] matches any lowercase letter from 'a' to 'z').
    However, if the hyphen is positioned as the very first or very last character within the square brackets, it loses its special "range" meaning and is treated as a literal hyphen character.
    Ответ написан
  • Как сделать путь в bash-скрипте относительным места запуска?

    hint000
    @hint000
    у админа три руки
    Внутри каждого скрипта есть файл с переменными.
    Я подключаю его так:
    . ./variables.sh

    Но при запуске алиаса, например get1, я получаю сообщение об ошибке: variables.sh: No such file or directory.
    Сменяйте рабочий каталог на тот, из которого запускается скрипт.
    cd $(dirname $(realpath $0))
    ./variables.sh


    А нельзя ли сделать путь внутри алиаса таким, чтобы находясь в любой поддириктории корневой директории, например в ~/BBB, или в ~/BBB/bash, алиас срабатывал верно?
    В алиасе пропишите абсолютный путь. Скрипты будут универсальные, алиасы не универсальные.
    Либо напишите один скрипт, который будет запускать любые по параметру:
    вместо get1 будете вызывать get 1
    а внутри
    [ -d ~/$1/bash ] || (echo "нет каталога"; exit 1)
    [ -f ~/$1/bash/$1.sh ] || (echo "нет скрипта"; exit 2)
    echo "запускаю"
    ~/$1/bash/$1.sh
    т.е. по get 123 будет запущено ~/123/bash/123.sh
    Ответ написан
    Комментировать
  • Как для find отключить вывод лога при поиске без параметра -name или -iname?

    hint000
    @hint000
    у админа три руки
    без параметра -name или -iname
    А с каким параметром? Каким-то критерием вы ограничили поиск?
    find начинает выводить в консоль лог поиска (папки и фаилы которые были проверены)
    Это не лог, а результат поиска. Вы же хотите получить какой-то результат, иначе бы не запускали команду.
    Если ограничения не заданы, то все файлы являются результатом поиска - они и выводятся.
    В принципе вы можете направить результаты "в никуда", добавив в конец команды > /dev/null
    Ответ написан
  • Скрипт для ubuntu который перезапускает сервис/службу при снижения входящего трафика?

    hint000
    @hint000
    у админа три руки
    [ $(( ( $(cat /sys/class/net/eth0/statistics/rx_bytes) - $(sleep 10; cat /sys/class/net/eth0/statistics/rx_bytes) )/-10 )) -lt 5000 ] && echo need restart

    Это в CRON на каждую минуту, а echo need restart заменить на команду рестарта сервиса. 5000 (байт в секунду) заменить на желаемую величину.

    Скрипт берёт значение системного счётчика принятых байтов, ждёт 10 секунд, снова берёт значение счётчика, вычитает одно из другого, затем делит разность на те самые 10 секунд (на -10, т.к. вычитали большее из меньшего), получается среднее значение за 10 секунд. Остаётся сравнить с пороговым значением.
    Ответ написан
    6 комментариев
  • Как в bash-скрипте сделать двойное условие?

    hint000
    @hint000
    у админа три руки
    Круглые скобки работают внутри [[ ]], но не работают внутри [ ].
    Обратите внимание, что между двумя брекетами [[ не должно быть пробела, это единый оператор проверки, а не один [ внутри другого [.
    if [[ ( "$projectDir" = "video" || "$projectDir" = "audio" ) && "$flag" != "noflag" ]]

    Но попробуем убить двух зайцев: оставить конструкцию возможно ближе к вашей исходной и при этом обойтись [ и не использовать [[. Выходит костыльно, что ж.
    if [ "$([ "$projectDir" = "video" -o "$projectDir" = "audio" ]&& echo 1)" -a "$flag" != "noflag" ]
    Ответ написан
  • Как в Linux найти файлы одинакового размера?

    hint000
    @hint000
    у админа три руки
    Нужно получить список всех файлов с одинаковым размером. Чтобы потом уже вручную удалить дупликаты.
    Вы можете в несколько кликов искать и удалять дубликаты файлов, используя GUI-утилиту под названием FSlint. Находит не просто совпадение размера, а именно совпадение и размера, и содержимого. Имена файлов при этом могут быть разные. Просто добавляете несколько папок, по которым нужно искать дубликаты, потом среди найденных выделяете те, которые хотите удалить и удаляете. Т.е. вручную можно выбирать в какой из папок файл оставить, а в какой удалить. Можно все дубликаты оставить, можно все удалить (!).
    Утилита имеет и другие функции для поиска разных корявостей и неоптимальностей в папках (имена с "плохими" символами, пустые папки и т.д.)

    Есть ещё утилита командной строки fdupes, которая тоже ищет дубликаты.
    Ответ написан
    2 комментария
  • Как вырезать слова из вывода?

    hint000
    @hint000
    у админа три руки
    sshd -T | grep -i ‘^mac” | xargs -n1 echo | grep -v etm | xargs echo

    Исходную строку разбили на много строк, по одному слову на строку, погрепали ненужное, снова собрали из отдельных слов одну строку.
    Это ленивый (и не универсальный) вариант, если не хотите изучать sed или awk, как советует pfg21 (а он плохого не посоветует).
    Ответ написан
    2 комментария
  • Как настроить rsyslog.conf?

    hint000
    @hint000
    у админа три руки
    Чтобы задать правильный вопрос, вам нужно понять один принцип.
    Событие для записи в лог генерирует конкретная программа. Вернее, множество конкретных программ.
    TCP (сбоев/разрывов соединений)
    Соединения tcp на конкретном хосте могут иметь десять, сто, тысяча программ. Чтобы конкретная программа писала в лог насчёт разрыва соединения, нужно, чтобы автор этой программы предусмотрел, написал кусок кода, который это делает. Чтобы тысяча программ писали в лог насчёт разрыва соединения, нужно, чтобы тысяча авторов написали в своих программах такие куски кода (что крайне маловероятно). Нет какой-то магии, которая бы без всякого программного кода делала что-то, чего кому-то захотелось.
    rsyslog простая штука, он записывает в лог события, которые получает от любых программ (ну ещё может получать события с других хостов или посылать на другой хост). Сам по себе он не следит за происходящим в системе. Знаете шутку "если никто не видел, значит ничего и не было" - так это как раз про rsyslog. Вот и подумайте, а кто должен сообщить логгеру про такое событие, как разрыв соединения.
    Ответ написан
    Комментировать
  • Как запустить команду при отсутствии пинга?

    hint000
    @hint000
    у админа три руки
    Для удобства написал функцию.
    is_host_acessible() {
      ping $1 -c 10 >/dev/null && echo 1
    }
    
    if [ ! $(is_host_acessible 192.168.123.45) ]; then
        echo "запускаем резервный сервак"
    fi

    а если кратко, то так
    ping 192.168.123.45 -c 10 || echo "запускаем резервный сервак"
    Ответ написан
    22 комментария
  • Какой есть универсальный и надежный способ замены байт в файле?

    hint000
    @hint000
    у админа три руки
    Меня интересует способ решить проблему, используя только встроенные в систему (в основном речь идет о macOS) утилиты
    там есть dd?
    echo -ne "\x04\x05\x06" | dd of=filename bs=1 seek=`grep -aboP "\x01\x02\x03" filename | cut -d ":" -f 1 | head -c -1`

    Монструозненько получилось (неравный бой с выводом grep). :) Если заглянет xotkot, то придумает, как оптимизировать, у него чёрный пояс по таким вещам.
    Ответ написан
    Комментировать
  • Как передать переменной в качестве аргумента вывод команды построчно?

    hint000
    @hint000
    у админа три руки
    #!/bin/bash
    cat file.txt | awk '{print "spisok-"$1}' | sort -u | xargs touch
    Ответ написан
    Комментировать
  • Как сделать так, чтобы баш скрипт работал с папками, содержащими пробелы?

    hint000
    @hint000
    у админа три руки
    В общем случае пробелы экранируют кавычками. В вашем коде и так почти везде переменные взяты в кавычки, но есть участок, где это не так; попробуйте взять в кавычки $1 и $i вот здесь:
    for i in `find $1 -type f`
    do
        # Получаем кодировку очередного файла
        cod=`enca -L ru $i`

    Заниматься реальным тестированием скрипта мне сейчас лень, просто надеюсь, что догадка сработает.
    Ответ написан
    9 комментариев
  • Как правильно работать с see?

    hint000
    @hint000
    у админа три руки
    Здесь аналогичный вопрос и два ответа:
    https://unix.stackexchange.com/questions/355096/re...
    Я проверил, оба варианта ответа работают:
    $ echo "1Rus2" | sed '/Russia/! s/Rus//g'
    12
    $ echo "1Russia2" | sed '/Russia/! s/Rus//g'
    1Russia2

    $ echo "1Rus2" | sed '/Russia/ n; s/Rus//g'
    12
    $ echo "1Russia2" | sed '/Russia/ n; s/Rus//g'
    1Russia2
    Ответ написан
    Комментировать
  • Как дополнить скрипт?

    hint000
    @hint000
    у админа три руки
    можно сделать однострочник:
    find "$DIR" -name "*.mp4" -printf "%P\n" | xargs -i{} basename {} .mp4 | pee 'xargs -i{} mkdir -p /config/rec/{}' 'xargs -i{} cp {}.mp4 /config/rec/{}/' 'xargs -i{} rclone copy /config/rec/{}/{}.mp4 cloud: --max-age 12h --create-empty-src-dirs -P --transfers=1 --checkers=1;'
    Ответ написан
  • Как найти все строки во всех файлах с такими параметрами?

    hint000
    @hint000
    у админа три руки
    например, по одному файлу:
    grep img | awk '!/alt/ || !/title/'
    Ответ написан
  • Как настроить работу с историей команд в Linux?

    hint000
    @hint000
    у админа три руки
    Нажмите Ctrl-R, начните набирать команду, увидите вариант из истории. Можно продолжить набирать, и предлагаемые варианты будут меняться, если набираемые символы не соответствуют ранее предложенному варианту. А можно в любой момент ещё несколько раз нажать Ctrl-R и сразу выбрать из других исторических вариантов. Чтобы вернуться к пропущенному варианту - Ctrl-Shift-R.
    Ответ написан
    3 комментария
  • Как загнать nc в переменную?

    hint000
    @hint000
    у админа три руки
    Прямо ваш вопрос:
    https://unix.stackexchange.com/questions/207957/as...
    nc -z -v -w2 $IP 1992
    STATUS=$?
    if [ $STATUS -ne 0 ]; then
            curl "https://api.telegram.org/$TOKEN/sendMessage?text=Не удалось соединиться&chat_id=$CHAT"
    fi
    Ответ написан
    2 комментария
  • Можно ли к результатам поиска, выведимых в файл, добавлять размеры найденного?

    hint000
    @hint000
    у админа три руки
    так сойдёт?:
    sudo find / -iname "log" -o -iname "logs" | xargs -l1 du -s > logs.txt

    или даже так
    sudo find / -iname "log" -o -iname "logs" | xargs -l1 du -s | sort -g > logs.txt
    Ответ написан
    3 комментария
  • Как получить распарсить и вернуть строку из функции bash?

    hint000
    @hint000
    у админа три руки
    echo $1 | awk -F- '$1=="p"{print $2}'
    если $1 будет "p-4", то выведет 4
    Ответ написан
  • Как переписать данный кусок кода под BASH?

    hint000
    @hint000
    у админа три руки
    Попробуйте собрать конструкцию из find и xargs, в этом случае цикл в явном виде не требуется.
    примеров навалом: https://www.google.com/search?q=find+xargs
    Если этого окажется недостаточно, то можно добавить awk, будет сложнее, но возможности широчайшие.
    Ответ написан
    Комментировать