|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Скрипт при каждом запуске добавляет строку в текстовый файл. Мне нужно сделать так, чтобы в этом файле всегда было 15 последний строк. То есть после добавления новой строки нужно удалить все устаревшие строки. И желательно без вспомогательного файла (то есть скопировать в новый файл 15 последних строк, удалить старый файл, переименовать новый файл в старый). tail -n 15 file > file не работает, файл получается пустой (потому что открыт в конвейере) Самое компактное и простое, что у меня получилось, это такое: tail -n 15 file | tee file > /dev/null Есть что-нибудь лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 13:27 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
В Linux sed умеет править "по месту" ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 01:59 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Это можно реализовать Средствами Потокового Текстового Редактора SEd, если присутствует Уверенность в том, что Задачу нужно Решать именно в эту Сторону: Код: powershell 1. 2. 3. 4.
Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
РазЯснения: "$(sed -n -e "$=" "${File}")"" — Общее Количество Строк в Файле. $(("$(sed -n -e "$=" "${File}")" + 1 − "${Lins}")) — Номер Первой Строки, которая должна СоХраниться. «+ 1» — Это потому что Нумерация Строк идёт с Единицы. Выражение в SEd «<Число>,$» означает Обработку Строк от <Число> и до Конца Файла. Символ Конца Файла «$» экранируется Обратным Слэшом «\» только потому, что после Него снова идёт Символ «$», относящийся к Следующей Конструкции «$(…)» (Выполнение ПодКоманды). Конструкция «$((…))» — ЦелоЧисленная Арифметика в SH/BASH. Конструкция «$(printf "!")d» используется исключительно для того, чтобы BASH не охуел при виде «!» в Командной Строке. Если использовать внутри Скрипта, то можно заменить на просто «!d», что означает «Не Удалять Строки». Параметр «-i ""» предписывает Редактору SEd изменить Существующий Файл и не создавать при Этом Резервную Копию. Если Что-то НеПонятно: «man sh, man bash, man sed, man …» ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 18:01 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Alibek B. Скрипт при каждом запуске добавляет строку в текстовый файл. Мне нужно сделать так, чтобы в этом файле всегда было 15 последний строк. То есть после добавления новой строки нужно удалить все устаревшие строки. И желательно без вспомогательного файла (то есть скопировать в новый файл 15 последних строк, удалить старый файл, переименовать новый файл в старый). tail -n 15 file > file не работает, файл получается пустой (потому что открыт в конвейере) Самое компактное и простое, что у меня получилось, это такое: tail -n 15 file | tee file > /dev/null Есть что-нибудь лучше? Варианты. Можно держать 15 файлов и переименовывать. Типа. Код: python 1. 2. 3. 4. 5.
При каждом добавлении строки та логика которая добавляет должна просто создавать файл last1row.txt Еще думаю тоже самое можно сделать на сим-линках. В этом случае можно файлы вообще не удалять а хранить целую историю. +Будет скользящее окно из линков которые будут отображаться на полседние 15 строк. Алгоритм - по сути тот-же самый. Вместо mv будет cp -s ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2019, 20:54 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Дорогой ты наш человек, да просто берёшь VIM версию 8 ( не ниже ), тренируешься в нём, осуществляя все необходимые тебе редактирующие действия, а потом автоматизируешь из ком. строки с помощью ключа --remote-send Код: powershell 1.
где: XXXXXXXXXXX - добавляемая в конец буфера строка <CR> - синтаксис перевода строки <C-\><C-N> - синтаксис переключения в нормальный режим из любого режима ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 07:40 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
PS: Ну и в конце добавляй 'write<CR>' , конечно, если тебе вдруг надо из этого файла читать содержимое какой-нибудь утилитой. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 07:49 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
A perl чем не угодил ? writebuf : Код: php 1. 2. 3. 4. 5. 6. 7.
Код: php 1.
Код: php 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 08:11 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
PS: запись идёт в файл test15 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 08:15 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Код: php 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 08:28 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
В конечном итоге сделал через tail -n 15 file > new и последующим mv -f new file. Способ с использованием tee оказался нестабильным, а все прочие вариации редактирования исходного файла (через sed или vi) по результатам strace/time менее эффективны. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 08:28 |
|
Циклический буфер средствами bash
|
|||
---|---|---|---|
#18+
Alibek B. результатам strace/time менее эффективны. Если приоритет на эффективность, то просто написать 8 строчек на "C". ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 08:31 |
|
|
start [/forum/topic.php?fid=25&msg=39882926&tid=1481095]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 283ms |
total: | 418ms |
0 / 0 |