Записи grep в файле журнала за последние 30 минут

Одна из вероятных причин кажущейся разницы в выводе ls -l между zsh и bash - это использование Tab -дополнение с включенным AUTO_REMOVE_SLASH в zsh (значение по умолчанию ).

AUTO_REMOVE_SLASH

Когда последний символ, полученный в результате завершения, представляет собой косую черту, а следующий набранный символ представляет собой разделитель слов, косую черту или символ, завершающий команду (например, точка с запятой или амперсанд) удалите косую черту.

При вводе ls -l symb Tab оба zsh и bash завершат это до ls -l symboliclink / ] (обратите внимание на / в конце). Разница в том, что zsh (с включенным AUTO_REMOVE_SLASH ) удалит косую черту, если вы просто нажмете Enter (т.е. завершите команду).

Таким образом, вы эффективно запустите ls -l symboliclink / в bash , который сообщает ls -l искать ссылку.Но в zsh вы запустите ls -l symboliclink , который сообщает ls -l , что вы хотите видеть информацию о ссылке, а не о целевом каталоге.

ls без опции -l всегда будет показывать содержимое целевого каталога, независимо от того, есть ли / в конце или нет.


Чтобы zsh не удалял косую черту в конце, достаточно просто ввести ее явно после завершения TAB . Обычно это не приводит к видимому изменению заполненного текста, но если вы введете пробел или подтвердите команду, / останется. «Обычно», потому что можно установить выделение для автоматически добавляемых символов суффикса, например пурпурного и полужирного:

zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"

( Примечание: это может не работать при использовании внешнего ZSH плагина подсветки синтаксиса )

Другое решение (очевидно) - отключить AUTO_REMOVE_SLASH . Это можно сделать с помощью

setopt noautoremoveslash

2
05.08.2016, 01:15
3 ответа

Отличные идеи, самое простое - это предложение @MelBurslan о различии файлов.

#!/bin/sh

MAILTO=user@email.com
OFILE=/var/tmp/alerts.tmp
LOG30=/var/tmp/LOG30
LOGNOW=/var/tmp/LOGNOW
HOST=`hostname`

# setup file
if [ -f ${OFILE} ]; then
  cat /dev/null > ${OFILE}
else
  touch ${OFILE}
fi


cat /var/log/logfile.log | egrep -i "error|warning" | tee -a ${LOGNOW}

diff ${LOG30} ${LOGNOW} | tee -a ${OFILE}

if [ -f ${OFILE} ]; then
  echo "Errors" | cat - ${OFILE} > temp && mv temp ${OFILE}
  mailx -r root@server.com -s "Errors" ${MAILTO} < ${OFILE}
fi

rm ${LOG30}
mv ${LOGNOW} /var/tmp/LOG30
rm ${OFILE}
0
27.01.2020, 22:04

Для преобразования в эпоху можно использовать следующий оператор:

# date +%s -d"Aug 1, 2016 2:15:29 PM MDT"
1470082529

Для преобразования эпохи в UTC можно использовать:

# date -d @1470082529
Tue Aug  2 00:45:29 IRDT 2016  #### on Linux Box

# date -r 1470082529
Tue Aug  2 00:45:29 IRDT 2016 ###on BSD box
2
27.01.2020, 22:04

Я бы использовал модуль perl File::Tail. У меня сейчас нет времени писать пример, но в псевдокоде perlish это будет выглядеть примерно так:

#! /usr/bin/not-actually-perl

use strict;
use File::Tail;

use Net::SMTP or Mail::Mailer or one of the squillion other
  perl mail sending modules;

open a File::Tail file handle to your log file

my $now=time();

my @lines = ();

while (read the File::Tail handle) {
  push @lines, $_;
  if (time() > ($now + 1800 seconds) ) {
    $now=time();
    email the @lines array to you@your.address;
    @lines=();
  }
}

Реально работающий скрипт, вероятно, будет меньше чем на 10 строк длиннее, чем приведенный выше, и большая его часть - это настройка заголовков для электронной почты.

и еще несколько строк для отлова различных сигналов, чтобы отправить по электронной почте то, что у него есть сейчас в @lines перед приостановкой или выходом.

Точные подробности см. в man-страницах для File::Tail и Net::SMTP (или любой другой).

1
27.01.2020, 22:04

Теги

Похожие вопросы