Como eu adiciono vários comandos “+” em menos da linha de comando?

4

O que eu sei e uso regularmente

Adorei como posso adicionar comandos ao less com o + -parameter na linha de comando. Eu gosto disso para pesquisas instantâneas:

$ less +/DHCP /var/log/syslog
# result: syslog at the point of the first occurrence of DHCP

No entanto, também gosto de configurá-lo para seguir a saída assim:

$ less +F /var/log/syslog
# result: a syslog that follows the file, very much like tail -f would.

O que eu gostaria de usar

Mas de vez em quando eu gostaria de AMBOS. Mas eu não tenho ideia de como fazer isso.

$ less +F +/DHCP /var/log/syslog
# result: "Pattern not found" - it will actually bunch up both things to one string.

Pontos de bônus para quem pode me dizer como posso filtrar automaticamente sem ter que pressionar no começo?

$ less +\&DHCP /var/log/syslog
# result: "please press enter" after which the filtering search _is_
# running correctly. I would love to get rid of that extra <enter>

edit2: Engraçado é que eu posso combinar isso:

$ less +?DHCP +G /var/log/syslog
# result: jumps to the end and reverse-searches for DHCP
# But I have to press enter (which I'd like to avoid)

mas eu não posso fazer isso:

$ less +G +?DHCP /var/log/syslog
# this is being bunched up to ?DHCPG and subsequently not found.

Então, a ordem parece ser importante, e todas as strings são interpretadas como se fossem uma?

Informações da versão

editar aqui está a versão de menos instalada no meu sistema, mas eu estaria disposto a instalar outra versão se necessário!

$ less --version
less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman
[...]
    
por amenthes 06.09.2016 / 20:45

3 respostas

7

Acho que não entendi a primeira parte da sua pergunta com base nos seus comentários posteriores. Para mim, usar less +F +/pattern logfile funciona e continua a destacar novas instâncias de pattern conforme elas aparecem no arquivo atualizado.

Quanto à parte bônus da sua pergunta, você pode tentar um dos seguintes comandos:

less +\&DHCP$'\n' /var/log/syslog

ou

less +\&DHCP^M /var/log/syslog

Nesse segundo comando, o ^M é gerado pressionando Ctrl-V then Enter . É mais fácil simplesmente digitar enter quando menos começa, a menos que você queira fazer um script ou algo assim.

    
por 06.09.2016 / 21:16
2

E na frente da hipercomplicação massiva: cauda automática com termos de pesquisa alteráveis através de um wrapper expect !

#!/usr/bin/env expect
#
# Sticky search wrapper for less; tails the given file, though with
# input of
#   /asdf
# or whatever will search for that new term then re-tail the file.
# Probably needs 'less' with (the default) hilight mode enabled.

if {[llength $argv] == 0} {
  puts stderr {Usage: $argv0 [searchterm] file}
  exit 64
} elseif {[llength $argv] == 1} {
  set fname [lindex $argv 0]
  set search ""
} else {
  set fname [lindex $argv 1]
  set search [lindex $argv 0]
}

# FIXME soas to nix any default options (like turning off hilight) and
# on account of LESSOPEN and LESSCLOSE being security risks due to the
# defaults certain vendors set.
foreach ev [list LESS LESSOPEN LESSCLOSE] {
  if {[info exists env($ev)]} {
    unset env($ev)
  }
}

match_max 999
set timeout -1

spawn -noecho less $fname
expect {
  # TODO need better way to detect that less didn't fly...
  -ex "No such file or directory" { exit }
  -re "." { }
  default { exit }
}

if {$search ne ""} {
  send -- "/$search\r"
}
send -raw "F"
interact {
  -echo -re "/(.*)\[\n\r]" {
#   send_user "DBG search $interact_out(1,string)"
    send -raw "
#!/usr/bin/env expect
#
# Sticky search wrapper for less; tails the given file, though with
# input of
#   /asdf
# or whatever will search for that new term then re-tail the file.
# Probably needs 'less' with (the default) hilight mode enabled.

if {[llength $argv] == 0} {
  puts stderr {Usage: $argv0 [searchterm] file}
  exit 64
} elseif {[llength $argv] == 1} {
  set fname [lindex $argv 0]
  set search ""
} else {
  set fname [lindex $argv 1]
  set search [lindex $argv 0]
}

# FIXME soas to nix any default options (like turning off hilight) and
# on account of LESSOPEN and LESSCLOSE being security risks due to the
# defaults certain vendors set.
foreach ev [list LESS LESSOPEN LESSCLOSE] {
  if {[info exists env($ev)]} {
    unset env($ev)
  }
}

match_max 999
set timeout -1

spawn -noecho less $fname
expect {
  # TODO need better way to detect that less didn't fly...
  -ex "No such file or directory" { exit }
  -re "." { }
  default { exit }
}

if {$search ne ""} {
  send -- "/$search\r"
}
send -raw "F"
interact {
  -echo -re "/(.*)\[\n\r]" {
#   send_user "DBG search $interact_out(1,string)"
    send -raw "%pre%3\r/"
    send -- $interact_out(1,string)
    send -raw "\rF"
  }
}
3\r/" send -- $interact_out(1,string) send -raw "\rF" } }
    
por 06.09.2016 / 23:57
0

Pelo que entendi, você está querendo ler o arquivo /var/log/syslog e ver todas as entradas com "DHCP" e continuar vendo novas entradas conforme elas aparecem. Se isso estiver correto, pode ser obtido com tail -f /var/log/syslog | grep DHCP . Se a minha interpretação do seu pedido não estiver correta, onde foi que eu errei?

    
por 06.09.2016 / 20:49