Làm thế nào để xóa các lệnh trong lịch sử khớp với một chuỗi nhất định?


13

Tôi cần xóa tất cả các lệnh trong lịch sử của mình khớp với một chuỗi. Tôi đã thử:

$ 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)

Cách đúng đắn để làm điều này là gì?


Trong khi có những câu trả lời hoạt động dưới đây, tôi vẫn tự hỏi tại sao nó không hoạt động history -d X. Tôi bắt gặp câu hỏi này vì tôi vừa mới làm xong history | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done. Không có lỗi, nhưng không có gì bị xóa. Bất cứ ai cũng có thể giải thích tại sao?
mivk

Câu trả lời:


17

Các historylệnh chỉ hoạt động trong hồ sơ lịch sử của bạn, $HISTFILE(thường ~/.historyhay ~/.bash_history). Sẽ dễ dàng hơn nhiều nếu bạn chỉ cần xóa các dòng khỏi tệp đó, có thể được thực hiện bằng nhiều cách.greplà một cách, nhưng bạn phải cẩn thận không ghi đè lên tệp trong khi vẫn đọc nó:

$ grep -v searchstring "$HISTFILE" > /tmp/history
$ mv /tmp/history "$HISTFILE"

Một cách khác là với sed:

$ sed -i '/searchstring/d' "$HISTFILE"

Câu trả lời tốt; $HISTFILEcó thể chứa không gian, có thể đáng trích dẫn nó.
Chris Xuống

Cẩn thận ... histfile là không thể đoán trước, nếu bạn có nhiều shell mở, sẽ không biết chính xác cái gì sẽ được lưu và theo thứ tự nào. Bất cứ ai cũng có thể xác nhận rằng các shell đã mở sẽ không viết lại lịch sử mà chúng đã tải khi khởi tạo, khi đóng?
orion

8

Câu trả lời của Michael Mrozek sẽ hoạt động nếu bạn không quan tâm đến việc xóa các lệnh khỏi phiên hiện tại. Nếu bạn làm như vậy, bạn nên ghi vào tệp lịch sử trước khi thực hiện các thao tác trong bài viết của mình bằng cách thực hiện history -a.

Ngoài ra, sau khi bạn đã gỡ bỏ các mục mà bạn muốn từ tập tin lịch sử của bạn, bạn có thể tải lại nó bằng cách phát hành history -c, sau đó history -r.


2

Dựa trên câu trả lời của MichaelChris , tôi đã đưa ra những điều sau đây. Thêm nó vào ~/.bashrctập tin của bạn và sau đó tải nó bằng . ~/.bashrchoặc source ~/.bashrc.

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Examples
        hxf "rm -rf"
        hxf ^source

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#The unalias prevents odd errors when calling". ~/.bashrc" (May result in
#"not found" errors. That's okay).
unalias hxf
hxf()  {
    read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history"
        grep -v "$1" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        echo "history -c"
        history -c

        #Overwrite the actual history file with the temp one.
        echo -e "mv /tmp/history \"$HISTFILE\""
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        echo -e "history -r \"$HISTFILE\""
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

2

Đối với những người tìm kiếm một lót:

while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done

Vì vậy, nếu bạn muốn ví dụ. xóa nhiều dòng có mật khẩu trong đó, chỉ cần thay thế "SEARCH_STRING_GOES_HERE" bằng mật khẩu. Điều này sẽ tìm kiếm toàn bộ lịch sử của bạn cho chuỗi tìm kiếm đó và xóa nó.

2 điều cần chú ý

  • grep sử dụng regex trừ khi bạn cung cấp -F làm đối số
  • Lệnh sẽ hiển thị 1 lỗi, một khi không còn kết quả khớp nữa. Bỏ mặc nó.

Tôi đã gặp một lỗi (-bash: history: -d: tùy chọn yêu cầu một đối số), nhưng nó vẫn hoạt động?
paradroid

Nó chạy lệnh xóa liên tục, cho đến khi nó bị lỗi (vì không còn gì để xóa). Chỉ cần bỏ qua lỗi.
thelogix

1
cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

Điều này làm việc cho tôi. history -c && history -a đã không tải lại tệp lịch sử đúng cách cho tôi. Vì vậy, thay vào đó tôi chỉ thoát phiên của mình ngay sau khi viết lại tệp lịch sử để cái trong bộ nhớ không ghi đè lên nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.