Как поп (прочитать и удалить) строку файла?

Страница руководства для systemd unit утверждает:

В частности, перенаправление с использованием "" и ">>", каналов с использованием "|", запуск программ в фоновом режиме с использованием "& "и другие элементы синтаксиса оболочки не поддерживаются.

Далее объясняется, как их можно использовать:

ExecStart=/bin/sh -c 'dmesg | tac'

В вашей ситуации вы могли бы сделать это:

ExecStart=/bin/sh -c 'exec /usr/bin/python2.7 /usr/local/py-kms-master/server.py 192.168.1.100 1688 -v > /usr/local/py-kms-master/pykmsss.log'

6
11.10.2018, 16:49
2 ответа

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

В отличие от sed -i, tailдостаточно умен, чтобы не читать файл с начала, чтобы определить его последнюю строку; Кроме того, в linux есть утилита truncate(1), которая в сочетании с tailпозволяет вам «вытолкнуть» последнюю строку (с )огромного файла за O (1 )раз:

# usage popline file [line_count, 1 by default]
popline()(LC_CTYPE=C; l=`tail -n "${2:-1}" "$1"; echo t`; l=${l%t}; truncate -s "-${#l}" "$1"; printf %s "$l")

$ wc -l /tmp/foo
3579500 /tmp/foo
$ cp /tmp/foo /tmp/foo1 && time sed -i '$d' /tmp/foo1

real    0m1.077s
user    0m0.457s
sys     0m0.156s
$ cp /tmp/foo /tmp/foo1 && time popline /tmp/foo1
 */

real    0m0.052s
user    0m0.002s
sys     0m0.003s
11
27.01.2020, 20:21

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

sed -i -e '${w /dev/stdout' -e 'd;}' file

Это запустит следующий sedскрипт:

${
    w /dev/stdout
    d
}

Последняя строка записывается в /dev/stdout, а затем удаляется. Все остальные строки записываются обратно в исходный файл через опцию -i.

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

Сed:

ed -s file <<END_ED
p
d
w
END_ED

edоткрывает файл fileи помещает курсор в последнюю строку файла. Первая команда выводит эту строку в стандартный вывод, вторая удаляет ее, а последняя команда записывает буфер обратно в файл. Использование edтаким образом нецелесообразно для больших файлов.

7
27.01.2020, 20:21

Теги

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