Usando o awk:
history | awk '{$1="";print}'
Às vezes, faço o comando history
para ver quatro comandos seguidos.
Eu quero copiar esses comandos para que eu possa executá-los novamente.
Eu costumo selecioná-los com o mouse e shift-ctrl-c, que funciona bem, mas eu também recebo os números de linha.
Como posso fazer history
e não ter números de linha?
Eu tentei a página man, mas fiquei impressionado.
Observe que a saída do histórico pode depender do ambiente local. Na minha máquina, parece:
$ history | tail -1
2993 2012-08-13 17:42:17 echo "test"
e nenhuma de suas respostas funcionará ao meu lado.
Uma opção útil é fc
(geralmente é integrada), que funciona perfeitamente independente das configurações locais.
fc
tem -n
opção que suprime números na saída. Então, seu comando ficaria assim:
fc -l -n
produz apenas os últimos comandos.
Para produzir todo o histórico neste estilo, use:
fc -l -n 1
Para produzir sem espaços no começo, você pode usar sed para removê-los:
fc -l -n 1 | sed 's/^\s*//'
Em bash
:
history | tr -s ' ' | cut -d' ' -f3-
Em zsh
e ksh
:
history -n
Em tcsh
:
history -h
Veja também a resposta de rush sobre o uso de fc
.
Uma solução alternativa é usar o método block select do terminal, se ele estiver disponível. Normalmente, você simplesmente segura Ctrl antes de selecionar com o mouse. Isso permitirá o modo de seleção de blocos em muitos terminais modernos (definitivamente os numerosos terminais baseados em libvte).
Em seguida, basta arrastar e soltar para que o bloco de seleção cubra todas as linhas (até a largura total do comando mais longo) que você deseja copiar. Então você simplesmente cole e as novas linhas serão preservadas.
Este é um truque simples que eu uso muitas vezes por dia ao fazer cópias / pastas rápidas, para evitar coisas como números de linha prefixados, timestamps em arquivos de log, etc.
Observe que isso não funcionará se um dos comandos copiados ocupar mais de uma linha!
tl; dr: use history -p \!-{4..1}
Se a única razão pela qual você deseja copiá-los é para poder executá-los novamente, convém usar simplesmente a expansão do histórico. (Execute LESS='+/^history expansion' man bash
para ver a página do manual para isso.)
Por exemplo, digamos que eu queira executar novamente os últimos quatro comandos. Eu posso apenas digitar:
!-4; !-3; !-2; !!
Se eu não tiver certeza absoluta de que foram os quatro últimos comandos e quero verificar quais eram esses comandos antes de executá-los, posso usar o modificador p
para imprimir a expansão e adicioná-la ao meu histórico sem realmente executando:
!-4; !-3; !-2; !!:p
(Colocar em qualquer expansão de histórico é o suficiente; nada será executado dessa forma.)
Agora, se eu estou feliz com isso, basta pressionar a seta "para cima" e pressionar "enter".
Se eu quiser salvar um comando em um arquivo para referência futura, eu uso a opção -p
no comando history
. Primeiro, normalmente recebo o número do histórico do último comando, por exemplo, executando history | tail
. Digamos que é assim:
$ history | tail
1136 cd /tmp
1137 ls
1138 cd -
1139 pwd
1140 cp somefile ~-/
1141 ping somesite.com
1142 printf '%*.*s\n' 0 "$(tput cols)" "$(printf '%0.1s' -{1..$(tput cols)})"
1143 for ((i=1;i<=3;i++)); do awk -F: -vi="$i" '{if (NR != 1) {printf ":"} {printf "%s",$i}} END {printf "\n"}' input; done | column -t -s:
1144 cd ~/documents
1145 history | tail
Se eu quiser salvar o comando longo for
loop (linha 1143) para uso posterior, posso fazê-lo facilmente usando history -p
da seguinte forma:
$ history -p \!1143 >> my_list_of_one_liners.sh
Observe que history -p
em si não aparece na lista do histórico.
Observe também que history -p
pode aceitar vários argumentos e expandirá cada um em uma linha separada. Então realmente essa é a melhor resposta para a sua pergunta, que eu percebi agora.
Execute history -p \!-{4..1}
e você verá os últimos quatro comandos que você executou impressos no seu terminal sem números anteriores, perfeitos para copiar. O 4
pode ser substituído por qualquer número que você desejar.