tail -fa file на 10 минут / до N совпадающих строк?

Подстановочный знак оболочки должен распространяться на все, даже на этот. Таким образом, вы можете сделать это, удалив остальное содержимое и cd * , или используя более сложный цикл для проверки существующего. Я не уверен, что именно, но x = $ (ls | tail -n1) && cd "$ x" может сработать. Это не может быть пустая строка, потому что это не разрешено файловой системой.

В любом случае, вы должны как можно скорее переименовать эту штуку во что-нибудь нормальное. Попробуйте ls | hexdump , чтобы увидеть, что именно это за штука (это может быть любой непечатаемый символ или даже что-то в Юникоде, которое ваш терминал не может отобразить).

4
09.09.2016, 12:14
4 ответа

Этот код perl даст вам подсчитанный хвост

#!/usr/bin/perl
#
# Usage tailmax.pl <filename> [<num_lines>]
#
use strict;
use warnings;

use File::Tail;

my $logfile = shift @ARGV;
my $pattern = shift @ARGV || '';
my $count = shift @ARGV || -1;

my $fh = File::Tail->new(name => $logfile, tail => 0, interval => 0, maxinterval => 2) or
    die "Cannot open $logfile: $!\n";

while ($count != 0 and defined (my $line = $fh->read)) {
    if ($pattern eq '' or $line =~ /$pattern/) {
        print "$line";
        $count-- if $count > 0;
    }
}

, если вы сохраните его в файл, например / usr / local / bin / tailmax и сделать его исполняемым, вы можете вызвать его так, что даст вам следующие 100 сообщений из файла журнала / var / log / messages , которые содержат RE somepattern . (Для чтения этого файла может потребоваться root .)

tailmax /var/log/messages 'somepattern' 100
0
27.01.2020, 20:50

roaima правильно указывает вам на команду timeout , а head фактически завершается после того, как прочитает желаемое количество строк, поэтому я надеюсь, что с

timeout 600s tail -f ‹logfile› | ‹filter› | head -n 1000

вы бы попасть.

6
27.01.2020, 20:50

По умолчанию тайм-аут завершает процесс и канал прерывается.

timeout --foreground 600s tail -n 0 -f logfile | ...filter | head -n 1000| ...
  • timeout --foreground в противном случае мы увидели бы просто «Завершено»
  • tail -n 0 -f , чтобы показать только новые логи
  • head -n 1000 , чтобы «остановить после 1000 строк "

\ спасибо {roaima and Ulrich Schwarz}

1
27.01.2020, 20:50

Пробовал с помощью приведенной ниже команды, все сработало

tail -f /var/log/file.log & read -t 600; kill $!

Это запустит tail -fдля файла в фоновом режиме, а затем использует readс тайм-аутом, установленным на 10 минут. Когда readвозвращается, либо из-за того, что пользователь нажал Enter , либо из-за тайм-аута, фоновое задание tail -fпрекращается.

0
27.01.2020, 20:50

Теги

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