Como diminuir a rolagem da saída padrão de várias páginas no terminal?

2

Em um cluster no qual faço parte da equipe de gerenciamento, geralmente tenho que passar pela saída padrão de várias páginas de vários comandos, como sudo find / , para procurar problemas como links quebrados ou para verificar as árvores de diretórios. Outras vezes, preciso revisar arquivos de texto longos com listas de itens para ver se há nomes incomuns.

Normalmente, canalizando a saída através de less , posso rolar a página, mas acho que seria suficiente se a saída padrão rolasse um pouco devagar, assim como a rolagem de crédito no final de um filme.

Existe uma maneira de realizar isso no bash ou em qualquer outro ambiente de terminal?

    
por Ketan 16.06.2016 / 17:52

4 respostas

7

Responda ao comentário do thrig no OP. Funciona muito bem. Altere o decimal depois de dormir para modificar o tempo entre as linhas.

sudo find / | awk '{system("sleep .5");print}'

Saia com ctrl + z e depois mate o trabalho (ao usar o bash); ctrl + c só sai dessa linha.

Editar:

Fiz algumas pesquisas com base em um comentário abaixo. A sugestão awk '{system(sleep.5)||exit;print}' não estava funcionando no meu sistema, mas o seguinte parece permitir uma saída ctrl + c.

awk '{if (system("sleep .5 && exit 2") != 2) exit; print}'

Colocá-lo em um script ou dando-lhe um alias você vai economizar do túnel do carpo.

    
por 16.06.2016 / 18:35
5

pv , o visualizador de canais, permite imprimir uma linha a cada segundo, como:

cat foo | pv --quiet --line-mode --rate-limit 1 

(ou mais curto, pv -qlL1 ). Em --line-mode , o sinalizador --rate-limit ( -L ) define o número de linhas por segundo que serão impressas; quanto maior o número, mais rápida será a saída.

Ele deve estar disponível nos repositórios da sua distribuição (por exemplo, aptitude install pv para obtê-lo).

    
por 16.06.2016 / 18:40
3

Se for apenas a saída de find , será necessário limitar o valor dessa taxa, então você pode usar apenas o parâmetro find -exec para executar o sleep para cada linha:

sudo find / -exec sleep 0.2 \; -print
    
por 16.06.2016 / 21:09
2

Como prometido em uma resposta anterior, um programa simples em C. Por que não? Dia chato.

slower.c

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int delay;
    char* rem;
    if (argc > 1) {
        delay = strtol(argv[1], &rem, 10);
    } else {
        delay = 500;
    }

    char* line;
    size_t bufsize = 0;

    struct timespec ts;
    ts.tv_sec = delay / 1000;
    ts.tv_nsec = (delay % 1000) * 1000000;

    while (getline(&line, &bufsize, stdin) != -1) {
        printf("%s", line);
        nanosleep(&ts, NULL);
    }
    free(line);
}

Compile com um bom gcc slower.c -o slower . Se usado sem argumentos, os milissegundos por linha serão padronizados para 500.

Uso: sudo find / | ./slower [MILLISECONDS PER LINE]

Edit: Corrigido alguns dos códigos graças à entrada nos comentários. Aparentemente, o getline nem precisa do seu malloc imundo, ou qualquer valor padrão. Deixe o getline alocar a porcaria de si mesmo.

Editar 2: removido o uso incorreto de while (!feof(stdin)) e adicionado novamente na inicialização do bufsize para compatibilidade.

    
por 16.06.2016 / 22:21