Bash historię bez numerów linii


129

Polecenie bash historyjest bardzo fajne. Rozumiem, dlaczego pokazuje numery linii, ale czy istnieje sposób, aby wywołać polecenie historii i ukryć numery linii?

Chodzi o to, aby użyć polecenia historii, więc nie odpowiadaj cat ~/.bash_history

Prąd wyjściowy:

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

Historyczne źródło grafiki.

Pożądane wyjście:

man history
ls
ll
clear
cd ~
history

Historyczne źródło grafiki.

Dziękuję wszystkim za świetne rozwiązania. Paul jest najprostszy i będzie dla mnie odpowiedni, ponieważ mój rozmiar historii bash jest ustawiony na 2000.

Chciałem też podzielić się fajnym artykułem, który znalazłem dziś rano. Ma kilka dobrych opcji, których teraz używam, takich jak utrzymywanie zduplikowanych wpisów z historii basha i upewnianie się, że wiele sesji basha nie nadpisuje pliku historii: http://blog.macromates.com/2008/working-with -history-in-bash /


Czy mogę zapytać, dlaczego cat ~/.bash_historyjest to wykluczone?
flow2k

Odpowiedzi:


204

Spróbuj tego:

$ history | cut -c 8-

Czy możemy potokować wyjście z historypolecenia zamiast czytać plik?
cwd

Wydaje się działać! Czy możesz wyjaśnić, co robi? Czy zadziała, jeśli liczby będą wynosić 1 - 10 000?
cwd

29
man cut. Usuwa pierwsze 7 znaków z każdego wiersza wyjścia historypolecenia. Powinien mieć problemy tylko wtedy, gdy liczba przekroczy 99 999, coś, czego nigdy nie widziałem (i często używam pocisków ). Ale jeśli się tym martwisz:history | sed 's/^ *[0-9]* *//'
Keith Thompson

1
Myślę, że rozwiązanie @Paul R jest tym, czego potrzebuję. Na początku nie zdawałem sobie sprawy, że polecenie historii wypełnia numery wierszy spacjami, a teraz cutskładnia ma więcej sensu :) Dzięki @Keith Thompson za rozwiązanie, które będzie działać dla> 100k historii.
cwd

5
@cwd: Jeśli masz w historii 100 000 poleceń, czas wycofać się z klawiatury i wrócić do domu. Jeśli jesteś już w domu, wyjdź na zewnątrz. 8-)} (Tak, wiem, że historia może być zachowana między sesjami.)
Keith Thompson,

22

awk może pomóc:

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

Ta odpowiedź może zawieść, jeśli masz długą historię.


Ha ha, dzięki - substrjest o wiele prostsze, używałem history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'dla siebie !!
geedoubleya

17

Jestem całkiem świadomy, że to pytanie jest dla basha i wiele osób wolałoby nie przełączać się na zsh (cue downvotes ...)

Jeśli jednak chcesz przełączyć się na zsh, zsh obsługuje to natywnie (a także inne opcje formatowania historii)

zsh> fc -ln 0

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


7
Właściwie fcto też jest bashwbudowany. Jedyną różnicą jest to, że pierwsza linia jest 1takafc -ln 1
wisbucky

//, Głosujcie za tym, że przez najdłuższy czas nie wiedziałam, że istnieją alternatywy dla Basha, dopóki ktoś nie poruszył ich w takim kontekście.
Nathan Basanese

11

Spóźniłem się z tym, ale krótszą metodą byłoby dodanie następujących elementów w pliku ~/.bashrclub ~/.profile:

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

Od basha manpage:

       HISTTIMEFORMAT
              Jeśli ta zmienna jest ustawiona, a nie null, jej wartość jest używana jako
              ciąg formatu dla strftime (3), aby wydrukować powiązany znacznik czasu
              z każdym wpisem historii wyświetlanym przez wbudowaną historię. Jeśli
              ta zmienna jest ustawiona, znaczniki czasu są zapisywane w historii
              plik, aby mogły być zachowane w sesjach powłoki. To używa
              znak komentarza do historii, od którego ma być odróżniany znacznik czasu
              inne linie historii.

Korzystając z tej możliwości, sprytny hack polega na tym, że zmienna „drukuje” jako znak powrotu karetki ( \r) i czyści linię (kod ANSI K) zamiast rzeczywistego znacznika czasu.


Trochę prostsze, używając bardziej niejasnej składni:HISTTIMEFORMAT=$'\r\e[K'
wjandrea

5
I opcja HISTTIMEFORMAT=$'\r\e[K' history
jednowierszowa

5

Alternatywnie możesz użyć sed:

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

Używając aliasu, możesz ustawić to jako standard (umieść go w swoim bash_profile):

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

1
\+w podstawowym wyrażeniu regularnym nie jest zgodne z POSIX. Użyj, \{1,\}jeśli sednie obsługuje niestandardowego \+rozszerzenia.
Richard Hansen

4

Chociaż cięcie z tą -copcją działa w większości praktycznych celów, myślę, że lepsze rozwiązanie byłoby przesłanie historii rurociągów do awk. Na przykład:

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

LUB

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

Oba te rozwiązania robią to samo. Dane wyjściowe historii są przekazywane do awk. Awk następnie usuwa pierwszą kolumnę, która odpowiada liczbom w danych wyjściowych polecenia historii. Tutaj awk jest wygodniejszy, ponieważ nie musisz przejmować się liczbą znaków w części liczbowej wyniku.

print $0jest odpowiednikiem print, ponieważ domyślnie wypisuje wszystko, co pojawia się w wierszu. Pisanie print $0jest bardziej wyraźne, ale wybór należy do Ciebie. Zachowanie print $0i po prostu printużycie z awk jest bardziej oczywiste, jeśli użyliśmy awk do wydrukowania pliku ( catszybsze byłoby wpisanie zamiast awk, ale służy to zilustrowaniu punktu).

[Np.] Użycie awk do wyświetlenia zawartości pliku z $ 0

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

[Np.] Używanie awk do wyświetlania zawartości pliku bez jawnego $ 0

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

[Np.] Używanie awk, gdy wiersz historii obejmuje wiele linii

$ 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

Z wyników history --help:

-w zapisz bieżącą historię do pliku historii

Zapisuje aktualną historię do określonego pliku - /dev/stdoutw tym przypadku.


3

historypolecenie nie ma opcji pomijania numerów linii. Będziesz musiał połączyć wiele poleceń, jak wszyscy sugerują:

Przykład:

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

3
Jeśli sedmimo wszystko zamierzasz to przeprowadzić , początkowe cięcie jest zbędne - po prostu dodaj je do wyrażenia.
moopet

2
$ hh -n

Możesz wypróbować https://github.com/dvorka/hstr, który pozwala na filtrowanie historii Bash „w stylu pola sugestii” z (opcjonalnym) porządkowaniem opartym na metrykach, tj. Jest znacznie wydajniejsze i szybsze zarówno w kierunku do przodu, jak i do tyłu:

wprowadź opis obrazu tutaj

Można go łatwo powiązać z Ctrl-ri / lubCtrl-s


1

Możesz użyć polecenia, cutaby go rozwiązać:

Wytnij pola z STDIN lub plików.

  • Wytnij pierwsze szesnaście znaków z każdego wiersza STDIN: cut -c 1-16

  • Wytnij pierwsze szesnaście znaków z każdego wiersza podanych plików: cut -c 1-16 file

  • Wytnij wszystko od trzeciego znaku do końca każdego wiersza: cut -c3-

  • Wytnij piąte pole każdego wiersza, używając dwukropka jako separatora pól (domyślnym separatorem jest tabulator): cut -d':' -f5

  • Wytnij drugie i dziesiąte pole każdego wiersza, używając średnika jako separatora: cut -d';' -f2,10

  • Wytnij pola od 3 do 7 w każdym wierszu, używając spacji jako separatora: cut -d' ' -f3-7


0

Wiem, że spóźniłem się na imprezę, ale o wiele łatwiej to zapamiętać:

cat ~/.bash_history

To prawda, ale druga linia OP: „Chodzi o to, aby użyć polecenia historii, więc proszę nie odpowiadać cat ~ / .bash_history”
Cireo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.