Cronologia dei bash senza numeri di riga


129

Il bash history comando è molto interessante. Capisco perché mostra i numeri di riga, ma esiste un modo per invocare il comando di cronologia e sopprimere i numeri di riga?

Il punto qui è usare il comando history, quindi per favore non rispondere cat ~/.bash_history

Uscita corrente:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

Fonte grafica storica.

Uscita desiderata:

man history
ls
ll
clear
cd ~
history

Fonte grafica storica.

Grazie a tutti per le vostre ottime soluzioni. Paul's è il più semplice e funzionerà per me perché la mia dimensione della storia di bash è impostata su 2000.

Volevo anche condividere un articolo interessante che ho trovato stamattina. Ha un paio di buone opzioni che sto usando ora, come mantenere voci duplicate fuori dalla cronologia di bash e assicurarsi che più sessioni di bash non sovrascrivano il file di cronologia: http://blog.macromates.com/2008/working-with -Storia-in-bash /


Posso chiedere perchè cat ~/.bash_history è escluso?
flow2k,

Risposte:


204

Prova questo:

$ history | cut -c 8-

È possibile reindirizzare l'output dal historycomando anziché leggere il file?
Cwd,

Sembra funzionare! Puoi spiegare cosa sta facendo? Funzionerà se i numeri sono 1 - 10.000?
Cwd,

29
man cut. Sta eliminando i primi 7 caratteri di ogni riga di output del historycomando. Esso dovrebbe avere solo problemi se il numero è superiore a 99.999, qualcosa che non ho mai visto (e io uso conchiglie un sacco ). Ma se sei preoccupato per questo:history | sed 's/^ *[0-9]* *//'
Keith Thompson,

1
Penso che la soluzione di @Paul R sia ciò di cui ho bisogno. All'inizio non mi ero reso conto che il comando history stava cutriempiendo di spazi i numeri di riga e ora la sintassi ha più senso :) Grazie @Keith Thompson per la tua soluzione che funzionerà per> 100k storie.
Cwd,

5
@cwd: se hai 100.000 comandi nella tua cronologia, è tempo di tornare indietro dalla tastiera e tornare a casa. Se sei già a casa, esci. Cool} (Sì, so che la cronologia può essere conservata in tutte le sessioni.)
Keith Thompson,

22

awk può aiutare:

history|awk '{$1="";print substr($0,2)}'

Questa risposta può fallire se hai una lunga storia.


Ah Ah, grazie - substrè molto più semplice, ho usato history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'per il mio !!
geedoubleya,

17

Sono abbastanza consapevole che questa domanda è per bash e molte persone preferirebbero non passare a zsh (cue downvotes ...)

Tuttavia, se si fosse disposti a passare a zsh, zsh lo supporta in modo nativo (così come altre opzioni per la formattazione della cronologia)

zsh> fc -ln 0

(Vedi /server/114988/removing-history-or-line-numbers-from-zsh-history-file )


7
In realtà fcè anche bashincorporato. L'unica differenza è che la prima riga è 1, quindi sarebbefc -ln 1
wisbucky

//, Ho un voto per il fatto che non sapevo nemmeno che c'erano alternative a Bash per il tempo più lungo fino a quando qualcuno le ha sollevate in un contesto come questo.
Nathan Basanese

11

Sono in ritardo su questo, ma il metodo più breve sarebbe quello di aggiungere quanto segue nel tuo ~/.bashrco ~/.profilefile:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

Da bash manpage :

       HISTTIMEFORMAT
              Se questa variabile è impostata e non è nulla, il suo valore viene utilizzato come a
              stringa di formato per strftime (3) per stampare il timestamp associato
              con ogni voce della cronologia visualizzata dalla cronologia incorporata. Se
              questa variabile è impostata, i timestamp vengono scritti nella cronologia
              file in modo che possano essere conservati nelle sessioni della shell. Questo usa
              il carattere di commento cronologico per distinguere i timestamp
              altre linee della storia.

Utilizzando questa funzionalità, un trucco intelligente consiste nel rendere la variabile "stampa" un ritorno a capo ( \r) e cancellare la riga (codice ANSI K) anziché un timestamp effettivo.


Un po 'più semplice, usando una sintassi più oscura:HISTTIMEFORMAT=$'\r\e[K'
wjandrea,

5
E un'opzione a una riga:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea,

5

In alternativa, puoi usare sed:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

Usando l'alias, puoi impostare questo come standard (incollalo nel tuo bash_profile):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"

1
\+in un'espressione regolare di base non è conforme POSIX. Utilizzare \{1,\}se sednon si supporta l' \+estensione non standard .
Richard Hansen,

4

Sebbene tagliare con l' -copzione funzioni per la maggior parte degli scopi pratici, penso che la cronologia delle tubazioni su Awk sarebbe una soluzione migliore. Per esempio:

history | awk '{ $1=""; print }'

O

history | awk '{ $1=""; print $0 }'

Entrambe queste soluzioni fanno la stessa cosa. L'output della storia viene alimentato in awk. Awk quindi cancella la prima colonna, che corrisponde ai numeri nell'output del comando history. Qui awk è più conveniente perché non devi preoccuparti del numero di caratteri nella parte numerica dell'output.

print $0è equivalente a print, poiché l'impostazione predefinita è stampare tutto ciò che appare sulla linea. La digitazione print $0è più esplicita, ma quale scegli dipende da te. Il comportamento di print $0e semplicemente printquando usato con awk è più evidente se hai usato awk per stampare un file ( catsarebbe più veloce digitare invece di awk, ma questo è per illustrare un punto).

[Ex] Uso di awk per visualizzare il contenuto di un file con $ 0

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Ex] Utilizzo di awk per visualizzare il contenuto di un file senza esplicito $ 0

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex] Uso di awk quando la riga della cronologia si estende su più righe

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

4
history -w /dev/stdout

Dall'output di history --help:

-w scrive la cronologia corrente nel file della cronologia

Scrive la cronologia corrente nel file specificato, /dev/stdoutin questo caso.


3

historyil comando non ha un'opzione per sopprimere i numeri di riga. Dovrai combinare più comandi come tutti suggeriscono:

Esempio :

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'

3
Se lo eseguirai sedcomunque, il taglio iniziale è ridondante: basta invece aggiungerlo all'espressione.
Moopet,

2
$ hh -n

Potresti provare https://github.com/dvorka/hstr che consente il filtro "suggerisci stile box" della cronologia di Bash con ordini (facoltativi) basati su metriche, ovvero è molto più efficiente e veloce sia in avanti che all'indietro:

inserisci qui la descrizione dell'immagine

Può essere facilmente associato Ctrl-re / oCtrl-s


1

Puoi usare il comando cutper risolverlo:

Ritaglia i campi da STDIN o dai file.

  • Ritaglia i primi sedici caratteri di ogni riga di STDIN: cut -c 1-16

  • Ritaglia i primi sedici caratteri di ciascuna riga dei file indicati: cut -c 1-16 file

  • Taglia tutto dal 3 ° carattere alla fine di ogni riga: cut -c3-

  • Taglia il quinto campo di ogni riga, usando i due punti come delimitatore di campo (il delimitatore predefinito è la scheda): cut -d':' -f5

  • Taglia il secondo e il decimo campo di ogni riga, usando un punto e virgola come delimitatore: cut -d';' -f2,10

  • Ritaglia i campi da 3 a 7 di ogni riga, usando uno spazio come delimitatore: cut -d' ' -f3-7


0

So di essere in ritardo per la festa, ma è molto più facile da ricordare:

cat ~/.bash_history

Vero, ma la seconda riga di OP: "Il punto qui è usare il comando history, quindi per favore non rispondere a cat ~ / .bash_history"
Cireo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.