Muszę usunąć wszystkie polecenia w mojej historii pasujące do ciągu. Próbowałem:
$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument
$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory
$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)
Jak to zrobić?
bash
text-processing
command-history
xargs
linuxfix
źródło
źródło
history -d X
. Natknąłem się na to pytanie, ponieważ właśnie to zrobiłemhistory | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done
. Brak błędu, ale nic nie zostało usunięte. Ktoś może wyjaśnić dlaczego?Odpowiedzi:
history
Komenda działa tylko na pliku historii,$HISTFILE
(zazwyczaj~/.history
albo~/.bash_history
). O wiele łatwiej będzie po prostu usunąć linie z tego pliku, co można zrobić na wiele sposobów.grep
jest jeden sposób, ale musisz uważać, aby nie nadpisać pliku podczas jego czytania:Innym sposobem jest
sed
:źródło
$HISTFILE
może zawierać spacje, prawdopodobnie warto je zacytować.Odpowiedź Michała Mrożka zadziała, jeśli nie zależy ci na usuwaniu poleceń z bieżącej sesji. Jeśli to zrobisz, powinieneś napisać do pliku historii przed wykonaniem operacji w jego poście
history -a
.Ponadto, po usunięciu wpisów, które chcesz z pliku historii, można przeładować go poprzez wydawanie
history -c
, następniehistory -r
.źródło
Dla tych, którzy szukają jednej linijki:
Więc jeśli chcesz np. usuń wiele wierszy z hasłem, po prostu zastąp „SEARCH_STRING_GOES_HERE” hasłem. Spowoduje to przeszukanie całej historii tego szukanego ciągu i usunięcie go.
2 rzeczy, o których należy pamiętać
źródło
history: -d: option requires an argument
błędu! Jest na KOŃCU pętli while => oczekiwano - działa, a następnie w zasadzie mówi: „Nie mogę znaleźć niczego innego!” :)Na podstawie odpowiedzi Michaela i Chrisa przedstawiłem następujące. Dodaj go do
~/.bashrc
pliku, a następnie załaduj za pomocą. ~/.bashrc
lubsource ~/.bashrc
.źródło
To zadziałało dla mnie. history -c && history -a nie przeładowałem poprawnie pliku historii. Zamiast tego kończę sesję zaraz po przepisaniu pliku historii, aby ten w pamięci go nie nadpisał.
źródło