Как с помощью bash прочитать определенные строки файла? [дубликат]

Я знаю, что этот вопрос довольно старый, но ради тех, кто столкнулся с этой проблемой, запуск демона супервизора работает для меня.

sudo service supervisor start

Более подробное объяснение заключается в том, что, как правило, когда вы сталкиваетесь с ошибкой «unix :///var/run/blabla.sock нет такого файла», скорее всего, проблема в том, что демон программы в теме(supervisordв этом случае )не был запущен и, следовательно, не смог сгенерировать ожидаемый файл сокета unix supervisor.sock. Этот файл является конечной точкой связи для команд переднего плана супервизора (, таких как supervisorctl), который действует как туннель/посредник, ответственный за ретрансляцию команд, выданных пользователем -, (напр.supervisorctl reread)к службе супервизора, работающей в фоновом режиме.

Вы можете обратиться к Unix Domain Socket и к этому ответу stackoverflow .

-9
25.08.2019, 02:12
1 ответ

«Используя только bash/sh» , вы можете прочитать определенные диапазоны строк файла, подобные этому:

{
    i=1
    while [ $i -le 29 ]
    do
        read -r
        (( i++ ))
    done
    lines30to80=
    while [ $i -le 80 ]
    do
        read -r line
        lines30to80="$lines30to80$line\n"
        i=$(( i + 1 ))
    done
} < textfile
... other code using $lines30to80

Это будет читать все предыдущие строки (, потому что иначе вы не можете знать, до какой строки вы дошли до ), а затем прочитаете только нужный вам диапазон строк перед закрытием файла.

Если вы впоследствии захотите прочитать строки 81 -130, вам нужно будет сделать это снова, в том числе пропустив первые 80 строк. Вместо этого вы можете написать свой второй этап внутри фигурных скобок, где файл уже продвинулся до нужной точки.


Если вы действительно используете Bash, вероятно,mapfileбудет лучше.

mapfile < textfile
lines30to80=("${MAPFILE[@]:30:51}")

lines30to80будет массивом из 51 строки, начиная с строки 30 и заканчивая строкой 80. Это, однако, считывает весь файл, но это означает, что когда вам нужны следующие строки, они уже загружены.. Вы также можете использовать

mapfile -s 29 -n 51 lines30to80 < textfile

для одной строки -, считанной в массив.


Вероятно, вы и сами не хотите; такая специфика и диапазон строк предполагают задачу обработки, для которой сценарии оболочки на самом деле не подходят. Настоящий язык, даже awk, будет намного надежнее.

Сценарии оболочки обычно не могут работать с двоичными данными, поэтому о чтении диапазонов байтов обычно не может быть и речи,хотя zsh имеет довольно сильную поддержку для этого.

6
28.01.2020, 05:21

Теги

Похожие вопросы