В файле конфигурации вы указали два шаблона для файлов журнала в / var / log / glusterfs / bricks
каталог:
*. Log
*. Log. *
Второй из этих шаблонов будет соответствовать любому повернутому файлу журнала. Вот почему вы получаете файлы с кажущимися бесконечными суффиксами .1
.
Файлы журнала не сжимаются, поскольку в конфигурации есть delaycompress
. Они будут сжаты при следующем повороте.Обратите внимание, что первая проблема (вращение уже повернутых бревен из-за второго вышеупомянутого шаблона) эффективно отключает любое сжатие, поскольку все вращения являются «первым» вращением.
Файлы журнала меняются, если их размер превышает 100 МБ, в соответствии с вашей конфигурацией. Есть один файл большего размера. Он вращается при каждом вызове и никогда не сжимается из-за вышеупомянутой проблемы со вторым шаблоном файла журнала выше.
Есть пустые лог-файлы. Это просто еще один следствие ошибочного шаблона сопоставления файлов журнала, описанного выше. При ротации файла журнала он копируется в имя-файла.log.1
, а исходный файл имя-файла.log
усекается («очищается»). . Опять же, из-за шаблона *. Log. *
в конфигурации файл имя-файла.log.1
будет скопирован в имя-файла. .log.1.1
при следующей ротации, а исходный имя-файла.log.1
будет усечен.
Это все работает, но поскольку шаблон файла журнала принимает не только фактические файлы журнала, но также и повернутые файлы журнала, в конечном итоге вы получаете беспорядок.
Использованиеawk
:
awk 'prev{ print prev ";" $0 }
{ prev = $0 }
END { if (NR) print prev ";" }'
что с учетом вашего ввода дает
A;B
B;C
C;
Быстрый и грязный способ (предполагает двойное чтение файла):
$ tail -n+2 file | paste -d';' file -
A;B
B;C
C;
Та же основная идея, что и у решения awk, предложенного Торином:
$ perl -lne 'print "$last;$_" if defined $last; $last=$_;END{print "$last;" if $.}' file
A;B
B;C
C;
Или, если вы любите краткость,:
$ perl -lne'$.>1?print"$l;$_":1;$l=$_}{print"$l;"if$.' file
A;B
B;C
C;
$ sed 'x;G;s_\n_;_;1d;${p;x;s_$_;_;}' file
A;B
B;C
C;
Что делает это sed
выражение:
x
:сохранить входящую строку в ячейке и получить предыдущую G
:добавить новую строку (из пробела )к старой s_\n_;_
:заменить разрыв строки -на ;
. 1d
:если это первая строка, удалить ее (не печатать )и перейти к следующей ${...;}
:если это последняя строка... p
:сначала вывести соединенную пару x
:получить последнюю строку s_$_;_
:добавить окончательную;
Несколько более простое sed
решение без пробела:
sed '$!N;y/\n/;/;p;y/;/\n/;D' file
$!N
для присоединения к следующей строке (если есть; $!
не требуется с GNU sed
, если не в режиме POSIX)y/\n/;/
заменить новую строку на;
p
вывести полученную строку y/;/\n/
, чтобы вернуться к новой строке, поэтому с помощью D
вы можете избавиться от первой строки и перейти к следующей Решение Vim
Можно выполнить эту команду (благодарим Conspicuous Compiler за предложение этого):
vim "+%s/\n\(.\+\)*/;\1\n\1" sample.txt
В качестве альтернативы и, возможно, более привычного варианта, запустите Vim, откройте файл и введите команду ex:
:%s/\n\(.\+\)*/;\1\n\1
Пояснение:
Замена шаблона:
\n
\(.+\)
, которая составляет всю следующую строку. Последующий квантификатор *
просто указывает, что совпадений может быть ноль или больше со следующими:
\1
\n
\1
. После: