Я думаю, это то, что вам нужно,
sed -n '/<tag>/,/<\/tag>/p' file.xml | head -10
Попробуйте выполнить команду ниже, чтобы получить первые две строки, которые начинаются с
,
$ sed -n '/^<tag>/p' file.xml | head -2
<tag><t1>john</t1></tag>
<tag><t1>john</t1></tag>
Для меня то, о чем вы спрашиваете, вполне нормально. Предположим, у вас есть три файла file1.log, file2.log and file3.log
внутри папки в /var/log/remote/
, и вы хотите ежедневно менять их местами и сохранять последние 10 сжатыми. Вы можете сделать это следующим образом:
/etc/logrotate.d/myfiles
. /var/log/remote/*.log
{
rotate 10
daily
sharedscripts
missingok
compress
}
logrotate
в режиме отладки.logrotate -d /etc/logrotate.d/myfiles
logrotate -f /etc/logrotate.d/myfiles
По сути, вы хотите чередовать файлы журналов, которые заканчиваются цифрой в указанном каталоге, чтобы сопоставление журналов стало:
/var/log/remote/*/*[0-9]
Проблема, с которой вы столкнулись, заключается в том, что logrotate
вероятно, параметр create
установлен по умолчанию, что означает, что после поворота файла журнала (он переименовывается и, возможно, сжимается ), новый файл журнала с оригинальным названием. Этого можно избежать, используя опцию nocreate
.
Однако самая большая проблема заключается в том, что ваши лог-файлы не имеют фиксированного имени. logrotate
хранит X версий лог-файлов с одинаковыми именами; поскольку имя меняется каждый день, logrotate
хранит одну версию на каждый день, поэтому ничего не удаляется.
Это могло бы сработать, если бы вы могли убедить все, что создает эти файлы журналов, иметь некоторый префикс, такой как «log -», чтобы имена стали «log -2019 -01 -09» и т. д. Теперь вы может сказать logrotate
использовать dateext
и dateformat -%Y-%m-%d
, и, надеюсь, это обманет logrotate
, предполагая, что часть даты была создана самим logrotate
. Затем конфигурация становится примерно такой:
/var/log/remote/*/log {
nocreate
dateext
dateformat -%Y-%m-%d
delaycompress
}
Однако на вашем месте я бы не стал заставлять logrotate
обрабатывать эти файлы журналов, которые ведут себя не так, как ожидает logrotate
. Я бы свернул свой собственный скрипт истечения срока действия журнала, что-то вроде:
#!/bin/sh
DAYS=90
TOPDIR=/var/log/remote
cd $TOPDIR
for i in *; do
if ! [ -d $TOPDIR/$i ]; then
continue
fi
cd $TOPDIR/$i
find -maxdepth 1 -type f -name '????-??-??' -mtime +1 -exec gzip {} \;
find -maxdepth 1 -type f -name '????-??-??.gz' -mtime +$DAYS -delete
done