Exiba o texto do arquivo uma página por vez, aguarde 20 segundos e avance automaticamente

Exiba o texto do arquivo uma página por vez, aguarde 20 segundos e avance automaticamente

Esta pergunta é para AIX 7

Tenho trabalhado em um monitor que exibirá várias páginas de texto. Inicialmente, o usuário final queria uma lista de rolagem para a qual construí isto:

IFS=''; cat plfeed | while read line; do echo $line; perl -e 'select(undef,undef,undef,.8)'; done

O usuário final decidiu que prefere exibir uma página (24 linhas) de saída por um determinado período de tempo (20 segundos, por exemplo). Eu sei que more me permitirá exibir uma página por vez, mas requer entrada de teclado, o que não é aceitável para meu caso de uso.

tldr;

Como posso automatizar o comando 'mais' ou criar uma função semelhante que durma entre as páginas e avance automaticamente?

Responder1

Este padrão razoável awkdeve funcionar no AIX

awk '{if(NR>1 && NR%24==1)system("sleep 20");print}'

Conforme mencionado nos comentários, se quiser sair na interrupção, você pode substituir system()por

{if(system("sleep 20"))exit}

mas pode não funcionar no seu sistema operacional.

Responder2

#!/usr/bin/env expect 
set timeout 20
spawn -noecho man autoexpect
while 1 {
  expect {
    timeout { send " " }
    -ex "(END)" { exit }
  }
}

Responder3

Isso aborda a questão do OP da natureza usando uma awksolução semelhante ameuh. Fiz as seguintes alterações:

  1. Saia via Ctrl+ c.
  2. Use $LINESpara obter a altura do terminal.
  3. Funciona em Linux e Mac OSX.
  4. Adicionada documentação e explicações.
awk -v x=$LINES 'NR % x == 0 && system("sleep 20"){exit} 1'
#    ^^^^^^^^^^  ^  ^^^^^^^^      ^                      ^
#       |        |  |             |                      |
#       |        |  |             |                      |
#       |        |  |             |                      +
#       |        |  |             |   f) pattern-action block which
#       |        |  |             |      prints the current line.
#       |        |  |             |        - Pattern is Truethy.
#       |        |  |             |        - Action is empty
#       |        |  |             |          defaulting to `{print}`
#       |        |  |             |
#       |        |  |             +
#       |        |  |   d) `system` function returns exit code `0` when
#       |        |  |       successful and non-zero on 'ctrl-c'.
#       |        |  |
#       |        |  |   e) `0` evaluates to false, so `exit` will not
#       |        |  |       execute until `ctrl-c` is triggered.
#       |        |  +
#       |        | c) When line number is evenly divisible
#       |        |    by x (the terminal height)
#       |        |    sleep for 1 second.
#       |        | 
#       |        | 
#       |        +
#       |   b) NR current line number.
#       |
#       +
# a) Set variable `x` to Bash variable $LINES.
#    $LINES is set to height of current terminal.

informação relacionada