powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Циклический буфер средствами bash
12 сообщений из 12, страница 1 из 1
Циклический буфер средствами bash
    #39882682
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт при каждом запуске добавляет строку в текстовый файл.
Мне нужно сделать так, чтобы в этом файле всегда было 15 последний строк.
То есть после добавления новой строки нужно удалить все устаревшие строки.
И желательно без вспомогательного файла (то есть скопировать в новый файл 15 последних строк, удалить старый файл, переименовать новый файл в старый).
tail -n 15 file > file не работает, файл получается пустой (потому что открыт в конвейере)
Самое компактное и простое, что у меня получилось, это такое: tail -n 15 file | tee file > /dev/null
Есть что-нибудь лучше?
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39882926
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Linux sed умеет править "по месту"
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39885393
Фотография CrazyMihey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это можно реализовать Средствами Потокового Текстового Редактора SEd, если присутствует Уверенность в том, что Задачу нужно Решать именно в эту Сторону:
Код: powershell
1.
2.
3.
4.
 File=~/Test.Txt	# Имя Обрабатываемого Файла.
 Lins="15"	# Количество Последних Скрок, которые должны остаться в Файле.
 for i in $(seq 128); do printf "Это Строка № %3u\n" "${i}" >> ${File}; done	# Создаём Большой Текстовый Файл, состоящий из 128 Строк.
 sed -e "$(("$(sed -n -e "$=" "${File}")" + 1 - "${Lins}")),\$$(printf "!")d" -i "" "${File}"	# Собственно, Удаление Лишних Строк.

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 cat "${File}"
Это Строка № 114
Это Строка № 115
Это Строка № 116
Это Строка № 117
Это Строка № 118
Это Строка № 119
Это Строка № 120
Это Строка № 121
Это Строка № 122
Это Строка № 123
Это Строка № 124
Это Строка № 125
Это Строка № 126
Это Строка № 127
Это Строка № 128
 rm "${File}"

РазЯснения:
"$(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 …»
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39885980
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Скрипт при каждом запуске добавляет строку в текстовый файл.
Мне нужно сделать так, чтобы в этом файле всегда было 15 последний строк.
То есть после добавления новой строки нужно удалить все устаревшие строки.
И желательно без вспомогательного файла (то есть скопировать в новый файл 15 последних строк, удалить старый файл, переименовать новый файл в старый).
tail -n 15 file > file не работает, файл получается пустой (потому что открыт в конвейере)
Самое компактное и простое, что у меня получилось, это такое: tail -n 15 file | tee file > /dev/null
Есть что-нибудь лучше?

Варианты.

Можно держать 15 файлов и переименовывать. Типа.

Код: python
1.
2.
3.
4.
5.
rm last15row.txt
mv last14row.txt last15row.txt
mv last13row.txt last14row.txt
..............
mv last1row.txt last2row.txt



При каждом добавлении строки та логика которая добавляет должна просто создавать файл last1row.txt

Еще думаю тоже самое можно сделать на сим-линках. В этом случае можно файлы вообще не удалять
а хранить целую историю. +Будет скользящее окно из линков которые будут отображаться на полседние 15 строк.
Алгоритм - по сути тот-же самый. Вместо mv будет cp -s
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886563
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дорогой ты наш человек,

да просто берёшь VIM версию 8 ( не ниже ), тренируешься в нём, осуществляя все необходимые тебе редактирующие действия,
а потом автоматизируешь из ком. строки с помощью ключа --remote-send

Код: powershell
1.
vim --servername VIM --remote-send ':$ append<CR>XXXXXXX<CR><C-\><C-N>:2,16 move 0<CR>:16 delete<CR>'



где:
XXXXXXXXXXX - добавляемая в конец буфера строка
<CR> - синтаксис перевода строки
<C-\><C-N> - синтаксис переключения в нормальный режим из любого режима
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886566
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: Ну и в конце добавляй 'write<CR>' , конечно, если тебе вдруг надо из этого файла читать содержимое какой-нибудь утилитой.
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886570
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A perl чем не угодил ?

writebuf :
Код: php
1.
2.
3.
4.
5.
6.
7.
#!/usr/bin/env perl
use Tie::File;

tie   @array, 'Tie::File', test15 or die $!;
push  @array, shift;
shift @array while  $#array > 14; 
untie @array; 



Код: php
1.
chmod +x writebuf



Код: php
1.
./writebuf "Графиня изменившимся лицом бежит пруду"
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886571
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: запись идёт в файл test15
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886576
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
perl -MTie::File -E 'tie@a,"Tie::File","test15"||die$!;push@a,shift;shift@a while$#a>14;untie@a' "Графиня бежит"
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886577
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конечном итоге сделал через tail -n 15 file > new и последующим mv -f new file.
Способ с использованием tee оказался нестабильным, а все прочие вариации редактирования исходного файла (через sed или vi) по результатам strace/time менее эффективны.
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886582
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
результатам strace/time менее эффективны.


Если приоритет на эффективность, то просто написать 8 строчек на "C".
...
Рейтинг: 0 / 0
Циклический буфер средствами bash
    #39886583
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эффективность с использованием существующих инструментов.
tail есть везде, а C не знаю.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Циклический буфер средствами bash
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]