Ответы пользователя по тегу bash
  • Сравнить файлы и удалить совпадения по первым 7 символам?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вообще такая себе идея проверять принадлежность адреса подсети с помощью строковых операций. Мне кажется лучше вместо баша заюзать питоновский скрипт и сделать все правильно. ВОт такие функции могут пригодиться:
    def mask(bitcount):
        return 2**bitcount-1 << (32-bitcount)
    
    def ip2int(ip):
        return sum(256**i*int(octet) for i, octet in enumerate(reversed(ip.split('.'))))
    
    def addr_in_network(addr, network):
        net, mask_size = network.split('/')
        mask_value = mask(int(mask_size))
        return ip2int(addr) & mask_value == ip2int(net) & mask_value
    Ответ написан
    Комментировать
  • Как работает перенаправление вывода скрипта python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Или вызывайте вот так:
    print(subprocess.getoutput('./1.py'))
    Так вы дождётесь полного выхлопа.
    Но если выхлопа много, то лучше запускать иначе, чтобы получить выходной пайп и вычитывая его в цикле слать всё на stdout __main__

    UPD: Дополню ответ, а то часть оказалась в комментариях.

    Такое происходит потом, что при перенаправлении выхлопа в файл происходит буфферизация. Накопительный буффер сбрасывается в файловую систему по факту своего заполнения или принудительно (по команде flush или по факту завершения процесса).

    При выхлопе, направленном в терминал, буфферизации нет и всё, что выводится, попадает в терминал сразу.
    Но если бы каждый байт писался в файловую систему без буффера, то это быо бы чертовски медленно и заставляло бы постоянно дёргаться картеку (реальную или виртуальную) лочного девайса, на котором у нас файловая система.
    Так и получается, что
    - сперва в stdout материнского процесса попадает некий текст,
    - потом запускаеется дочений процесс и что-то пишет в свой stdout,
    - потом дочерний процесс закрывается и сбрасывает накопившийся буффер, который перенаправляется по цепочке в выходной файл,
    - потом закрывается материнский процесс и весь его недозаполненный буфер тоже сбрасывается в файл.
    Ответ написан
    2 комментария
  • Как удалить все строки до n через sed?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А почему именно через sed?
    tail -n +10 << my_file
    Вернет все строки файла, начиная с десятой.
    Только нельзя писать в тот же файл, откуда читаете, иначе получите путой файл.
    Вот можно так:
    tail -n +10 my_file > temp_file; mv temp_file my_file
    Ответ написан
    6 комментариев
  • Существует ли компилятор в BASH?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    До чего же много извращенцев всяких в интернете.
    Ваш странный вопрос легко гуглится https://github.com/jcampbell05/bashjs
    Ответ написан
    Комментировать
  • Как упростить команду в bash?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Serials_destination2=$(find "$SerialsFolder" -type f -iname "$WhatRenameFile" | sed -n '1p'  ); Serials_destination=$(dirname "$Serials_destination2" ); mv "$WhatFolder"/* "$Serials_destination"
    Ответ написан
    Комментировать
  • В чем проблема с выводом?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Для большей ясности стоило бы приести пример выхлопа команды
    occtl --json show users
    Чтобы отвечающим не приходилось ставить VPN-сервер и подключать тестовых пользователей.
    Сходу видно, что вы запрашиваете результат в формате json, а затем парсите его грепами и awk'ом, что крайне бессмысленно и беспощадно. Почему бы не использовать jq для этой цели, а не пытаться забить шуруп молотком.
    Приведенная вами проблема связана с тем, что, вероятно, выхлоп в виде json происходит без гарантии порядка ключей, а ваш способ доставать из него данные весьма варварский.

    Да и проблемы в таком подходе на этом не ограничатся, ведь список пользователей может измениться между итерациями и даже между получаением имени и ip.
    Следовало бы единоразово получить все сырые данне, а затем вытаскивать из них нужное.
    Ответ написан
    Комментировать
  • Вывести в bash только дубликаты строк из файлов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Я бы предложил еще решение вроде такого:
    py "set(open('1'))&set(open('2'))"
    Но это уже скорее на питоне решение, а py в стандартном наборе не посавляется из коробки.
    Кроме того, это решение не эффективно при больших файлах.
    Ответ написан
    Комментировать
  • Почему не запускается .sh по крону?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В кронтабе надо указывать абсолютные пути и программы, которыми нужно открывать файлы.
    * * * * * /bin/sh /root/script.sh >> /tmp/script.log

    Добавил в пример как сделать, чтобы выхлоп скрипта добавился в файл и вы могли понять что там поломалось и как работает.
    Ответ написан
    2 комментария
  • Как записать логи ffmpeg в файл?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У вас там однотипные кавычки, во-первых. Это уже не хорошо.
    Во-вторых, вы перенаправление вывода делаете не там. Портится синтаксис вызова.
    Объявите функцию, в ней делайте что вам надо с перенаправлениями и вызывайте уже её.
    Вот здесь про объявление и вызов функций: https://habr.com/ru/company/ruvds/blog/327248/
    function myfunc {
    ffmpeg ... >> out.log
    }
    Ответ написан
    1 комментарий
  • Как спарсить файл в bash и сгенерировать список IP?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    - как-то заставить этот скрипт отрабатывать раз в сутки (например) средствами cron

    sudo crontab -e
    И добавьте туда @daily ивоттутстрокуизсоседнегорешения
    Ответ написан
    2 комментария
  • Как проверить наличие строки в файле в bash скрипте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    $ grep "\## \[1\.0\.3\]" t.md 
    ## [1.0.3]
    $ grep "\## \[1\.0\.5\]" t.md

    Почему нельзя грепунть-то?
    Ответ написан
    4 комментария
  • Как правильно распарсить логи с помощью bash?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вот такая штука будет работать примерно со скоростью мегабайт в секунду.
    cat oldlogfile.log | py -x "', '.join(['='.join((k, datetime.datetime.strptime(v, '%Y-%m-%d %H:%M:%S').strftime('%H:%M:%S.000 +0700 %a %b %d %Y')) if k == 'TIME' else (k, v)) for k, v in ((kv.split('=') for kv in x.split(', ')))])" > newlogfile.log

    Измерял так:
    yes "RESULT=xxxxx, TIME=2020-01-20 18:43:12, HOST=xxxxxxxxxxx, NAME=xxxxxxxx" \
      | pv \
      | py -x "', '.join(['='.join((k, datetime.datetime.strptime(v, '%Y-%m-%d %H:%M:%S').strftime('%H:%M:%S.000 +0700 %a %b %d %Y')) if k == 'TIME' else (k, v)) for k, v in ((kv.split('=') for kv in x.split(', ')))])" \
      > /dev/null

    Зато на порядок понятнее и можно по человечески формат подправить.
    Ответ написан
    3 комментария