Только произведите новые 10 (или n) строки долгого вывода команды

wget может сделать это:

wget -A.png,.jpg,.gif,.jpeg -e robots=off -m -k -nv -np -p \
--user-agent="Mozilla/5.0 (compatible; Konqueror/3.0.0/10; Linux)" \
http://site.url/

Единственная проблема может состоять в том в случае, если сайт генерирует свое содержание с помощью JavaScript.

3
05.05.2015, 12:57
5 ответов

Существует escape-последовательность для (vt100-выхода) терминалы ECMA-48, который ограничивает прокрутку подмножеством строк:

Вершина CSI; нижняя часть r

Вот демонстрация

# Start with the screen clean and cursor on line 1
clear

# print the non-scrolling banner line
echo Hello world

# set up the scrolling region to lines 2 through 11 and position the
# cursor at line 2
echo -n '^[[2;11r^[[2H'

# Run a command that will produce more than 10 lines, with a slight delay
# so it doesn't happen so fast you can't see it scrolling
perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'

# Restore normal scrolling and put cursor on line 12
echo -n '^[[r^[[12H'

Примечание: Все экземпляры ^[ в вышеупомянутом должны быть фактические символы ESC в сценарии. В vi, например, они вводятся в режим вставки с CtrlV, сопровождаемым Esc.

4
27.01.2020, 21:10
  • 1
    Это выглядит довольно потрясающим! Я собираюсь попробовать это позже. действительно ли возможно сделать это, не зная, сколько строк было уже отображено? И как я пишу им на чем-то как текстовый редактор на окнах? Просто скопируйте вставку с этого отрывка? –  BrainStone 26.08.2013, 05:04
  • 2
    Следовательно мое предложение для использования curses+perl (чтобы сохранить его максимально простым И попытаться сделать его терминальным неконкретный - путем использования проклятий, чтобы сделать работу этого...) ПРИМЕЧАНИЕ он может работать над терминалом Wumpus, но не может продолжить работать Ваш - или если команда, работал от консоли или Терминала Gnome или через шпаклевку и т.д. –  Drav Sloan 26.08.2013, 05:05
  • 3
    Просто протестированный это! Если бы можно заставить это работать без ведома количества строк, это было бы потрясающим! –  BrainStone 26.08.2013, 05:16
  • 4
    Можно использовать echo -e и \e также, который поддерживается в ответах здесь. Например. echo -en '\e[2;11r\e[2H' –  Michael Mrozek♦ 26.08.2013, 07:54

Мультихвост является a tail -f на стероидах. Его способности включают разделение экрана и показ нескольких файлов или команд.

Если важные строки прибывают из файла:

tar -cvf "Bckup.tar" "folder to backup/" | multitail important.txt -j

Если важные строки являются выводом команды:

tar -cvf "Bckup.tar" "folder to backup/" | multitail -l 'show-stuff --important' -j
4
27.01.2020, 21:10
  • 1
    Это довольно хорошо. Не excatly, что я хочу, но лучше, чем любой ответ. Это не делает reaaly тренировки, так как я хочу использовать это несколько время, и я все еще хочу смочь видеть другой материал otputed прежде. (Больше чем 1 строка...) –  BrainStone 26.08.2013, 04:55

Если я понимаю правильно, что BrainStone просит "окно прокрутки".

Можно достигнуть этого с Проклятиями и жемчугом:

#! /usr/bin/perl

use strict;
use warnings;
use Curses;

$SIG{INT} = sub { endwin; exit(0); };

initscr();

my $w = newwin(11, COLS(), 10, 1);
$w->scrollok(1);

my $a=0;
while(<>) {
    $a++ if($a < 10);
    $w->addstr($a, 0, $_);
    $w->refresh();
}
endwin;

Это создаст "окно прокрутки" в строке 10, 10 строк долго, которые отобразят вывод переданной по каналу команды. Необходимо будет изменить его для удовлетворения потребностям, но основная предпосылка там. Вы могли бы хотеть обработать все свои команды оболочки в жемчуге и иметь все это в одном сценарии. Или Вы могли, например, использовать аргументы команды для передачи Very important information. MUST BE VISIBLE! строка, или может быть имя файла, которое содержит важную информацию. И дисплей, что, прежде чем окно прокрутки создается.

Я сделал больше подробно версия на pastebin, который обрабатывает несколько опций команды (таких как размер окна прокрутки, количество строк в терминале для возмещения окна и "заголовочного файла" для отображения перед выводом). Подробная информация опций команды и некоторых дополнительных комментариев предоставлена.

Пример

Использование кода выше, как, если Вы выразились в названный файл scroller.pl, просто установите полномочия файлов, таким образом, это - исполняемый файл:

$ chmod +x scroller.pl

Можно затем использовать его для проявления вывода от длительной команды как так:

$ seq 10000 | scroller.pl

                       ss of scroller.pl

Эта версия затем выйдет когда вывод, передаваемый по каналу в scroller.pl завершено, и возвратите Вас своей нормальной установке оболочки.

2
27.01.2020, 21:10
  • 1
    , у меня нет в основном идеи, как использовать жемчуг. Таким образом, это не похоже на опцию мне. И я также хотел бы сохранить вещи простыми. –  BrainStone 26.08.2013, 04:52
  • 2
    Можно поместить тот код в файл, названный говорят "scroller.pl", chmod это с chmod 750 scroller.pl и затем можно сделать tar -zcvf mybackup.tar backupdir | scroller.pl - необходимо не обязательно изучить жемчуг для использования его :) Это - просто другой "инструмент", который можно использовать в сценариях. –  Drav Sloan 26.08.2013, 05:02
  • 3
    Тем не менее я хотел бы сохранить его в одном файле. Если ничто не будет работать, то я буду использовать Ваше решение. Не то, чтобы мне не нравится Ваше решение, оно просто действительно не соответствует моим потребностям. –  BrainStone 26.08.2013, 05:08
  • 4
    @BrainStone - как это больше сложно, чем решение Wumpus? Это намного более портативно и будет работать путем дампа кода в единственном файле и создания его excutable. Это почти столь легко, как это добирается... –  slm♦ 26.08.2013, 07:06
  • 5
    @DravSloan - Вы могли бы хотеть показать точно где в коде для создания модификаций. Это - один из более сильных ответов здесь, которые помогли бы заставить его выделиться. –  slm♦ 26.08.2013, 07:11

Если Вы всегда хотите видеть просто последние строки N, я не думаю, что можно избегать использования временного файла. Что-то вроде этого:

while true; do sleep 1; date +%s >> temp_file; done

Затем в другом терминале, выполненном

while true; do clear; tail -n 10 temp_file;sleep 1; done

Та последняя команда i) очистит терминал, ii) распечатает последние 10 строк временного файла и iii) ожидать в течение одной секунды. Результатом будет непрерывно обновляющий дамп текущих последних 10 строк временного файла.

Насколько я знаю, нет никакого способа сделать это при хранении исходной команды в поле зрения в единственном терминале.


Я, может казаться, не заставляю это работать на несколько строк, но это работает на одни строки:

#!/bin/bash

echo "Very important information. MUST BE VISIBLE!"
while tar -cvf "Bckup.tar" lmde_backup/www/lycabettus/ >tmp_file 2>&1 & do 
    output=$(tail -n 1 aa); 
    echo -ne "$output\r";
done

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

0
27.01.2020, 21:10
  • 1
    Это не хорошее решение также. Команду называют во время сценария, таким образом, я не могу только открыть другой терминал или даже очистить th терминал. Это сделало бы вещь бессмысленной, так как я действительно забочусь о том, что произошло перед командой. –   25.08.2013, 23:21
  • 2
    @BrainStone отредактируйте свой вопрос объяснить Ваши требования. Я все еще не ясен на том, почему Вы не можете просто позволить tail -f прокрутите свободно. Если Вы конкретно не заявляете, в чем Вы нуждаетесь (разъясните свой ответ на комментарий slhck, возможно, добавьте пример), мы не можем дать Вам удовлетворительный ответ. Ifit является сценарием, который печатает все эти строки, Вы могли сделать что-то умное с \r. –  terdon♦ 25.08.2013, 23:23
  • 3
    я обновил свой вопрос и обеспечил пример –   25.08.2013, 23:41

Вот простой сценарий удара, который можно использовать для контроля вывода команды (команда в этом примере rpm -qa) линию за линией с вручную определяют таймер автоматического отключения. Это также добавляет Ваш вывод во временный файл для ссылки после завершения сценария. Что касается циклического повторения через 10 буферов строки, я не могу думать о решении в этой точке.

#!/bin/bash

syntax="rpm -qa"
command=( $($syntax) )
echo "Using: $syntax"
for line in "${command[@]}"
 do
  echo "$line" >> /tmp/temp.file
  echo -ne "OUTPUT: $line\033[0K\r"
  sleep 0.2
done
echo


0
27.01.2020, 21:10
  • 1
    я не хочу управлять количеством строк. Я хочу, чтобы это работало. Я просто получаю вывод afer исходный законченный вывод. –   25.08.2013, 22:43
  • 2
    я обновил ответ для отражения более определенного разъяснения. Можно выследить stdout, как отражено в моем обновленном ответе. Пример: commands >> text.txt | tail -f -n 10 text.txt –   25.08.2013, 23:01
  • 3
    у меня также была эта идея, но это не будет работать также! tail -f Не завершит автоматически –   25.08.2013, 23:04
  • 4
    1. В использовании нет никакого смысла -f если Вы cat так как вывод никогда не будет изменяться, -f для контроля потоков файлов/текста. Я предполагаю, что Вы имели в виду tail -f -n 35 /var/log/messages но это все еще показывает новые строки, поскольку они входят, не удаляя предыдущие. Кроме того, commands >> text.txt | something_else не имеет никакого смысла, необходимо использовать && или ; разделить команды, | для передачи по каналу к другой команде и не будет работать, если Вы отправляете вывод левого операнда в файл. –  terdon♦ 25.08.2013, 23:07
  • 5
    @terdon. Спасибо за указание на мои ошибки. Я обновил ответ для отражения правильного синтаксиса после тестирования его, хотя это не предоставляет решение вопроса. –   25.08.2013, 23:25

Теги

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