Гость
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Циклический буфер средствами bash / 12 сообщений из 12, страница 1 из 1
29.10.2019, 13:27
    #39882682
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Циклический буфер средствами bash
Скрипт при каждом запуске добавляет строку в текстовый файл.
Мне нужно сделать так, чтобы в этом файле всегда было 15 последний строк.
То есть после добавления новой строки нужно удалить все устаревшие строки.
И желательно без вспомогательного файла (то есть скопировать в новый файл 15 последних строк, удалить старый файл, переименовать новый файл в старый).
tail -n 15 file > file не работает, файл получается пустой (потому что открыт в конвейере)
Самое компактное и простое, что у меня получилось, это такое: tail -n 15 file | tee file > /dev/null
Есть что-нибудь лучше?
...
Рейтинг: 0 / 0
30.10.2019, 01:59
    #39882926
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Циклический буфер средствами bash
В Linux sed умеет править "по месту"
...
Рейтинг: 0 / 0
05.11.2019, 18:01
    #39885393
CrazyMihey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Циклический буфер средствами bash
Это можно реализовать Средствами Потокового Текстового Редактора 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
06.11.2019, 20:54
    #39885980
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Циклический буфер средствами bash
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
08.11.2019, 07:40
    #39886563
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Циклический буфер средствами bash
Дорогой ты наш человек,

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


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


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