запись в файл, начиная с определенной строки

То, что вы ищете, в терминологии Debian / Ubuntu называется «предварительной» установкой. Его можно полностью автоматизировать туда, куда вы просто вставляете компакт-диск, а он делает все остальное - при достаточной конфигурации он может делать именно то, что вы хотите, как указано в вашем резюме. Полное обсуждение того, как работать с файлами preseed, для этого сайта немного длинно, но отличной отправной точкой для вас является просмотр следующих документов:

Довольно часть информации в нем будет дублироваться, но представлена ​​в несколько ином виде.

1
28.05.2019, 15:18
1 ответ

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

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

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

#!/bin/bash
for  timestamp in {1262300400..1264978800..600}; do
    date -d @"$timestamp" '+%Y %m %d %H %M %S'
done | grep -v '[15]0 00$' >>file.txt

Кроме того, это чрезвычайно медленный цикл, вызывающий dateбольшое количество раз (4465 раз, если быть точным; количество десяти -минутных отрезков времени в 31-дневном месяце ). Чтобы ускорить процесс, используйте тот факт, что GNU dateможет читать из файла (здесь, мы предоставляем временные метки на стандартном вводе, который dateчитает с помощью-f -):

#!/bin/bash
printf '@%s\n' {1262300400..1264978800..600} |
date -f - '+%Y %m %d %H %M %S' |
grep -v '[15]0 00$' >>file.txt

Это займет секунду или меньше.

Я также удалил -Eиз вызова grep, так как вы не используете расширенное регулярное выражение.

4
27.01.2020, 23:18

Теги

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