วิธีการลบคำสั่งในประวัติศาสตร์ที่ตรงกับสตริงที่กำหนด?


13

ฉันต้องลบคำสั่งทั้งหมดในประวัติของฉันที่ตรงกับสตริง ฉันได้พยายาม:

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

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


1
history -d Xในขณะที่มีกำลังทำงานคำตอบดังต่อไปนี้ผมก็ยังสงสัยว่าทำไมมันไม่ได้ทำงานกับ ฉันเจอคำถามนี้เพราะเพิ่งทำhistory | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; doneไป ไม่มีข้อผิดพลาด แต่ไม่มีอะไรถูกลบ ทุกคนสามารถอธิบายได้ว่าทำไม
mivk

คำตอบ:


18

historyคำสั่งเพียงแค่ทำงานกับแฟ้มประวัติของคุณ$HISTFILE(ปกติ~/.historyหรือ~/.bash_history) มันจะง่ายกว่านี้ถ้าคุณเพิ่งลบบรรทัดออกจากไฟล์นั้นซึ่งสามารถทำได้หลายวิธี grepเป็นวิธีหนึ่ง แต่คุณต้องระวังอย่าเขียนทับไฟล์ในขณะที่ยังอ่านอยู่:

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

อีกวิธีคือsed:

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

คำตอบที่ดี; $HISTFILEอาจมีช่องว่างน่าจะน่าสนใจ
Chris Down

ระวัง ... histfile นั้นไม่แน่นอนถ้าคุณมีหอยเปิดจำนวนมากมันไม่ได้บอกว่าอะไรจะได้รับการบันทึกอย่างถูกต้องและในลำดับใด ทุกคนสามารถยืนยันได้ว่ากระสุนที่เปิดอยู่แล้วจะไม่เขียนประวัติที่โหลดเมื่อเริ่มต้นหรือไม่?
orion

8

คำตอบของ Michael Mrozek จะใช้งานได้หากคุณไม่สนใจที่จะลบคำสั่งออกจากเซสชันปัจจุบัน history -aถ้าคุณทำคุณควรเขียนไปยังแฟ้มประวัติก่อนที่จะทำการดำเนินงานในการโพสต์ของเขาด้วยการทำ

นอกจากนี้หลังจากที่คุณได้ลบรายการที่คุณต้องการจากแฟ้มประวัติของคุณคุณสามารถโหลดได้โดยการออกแล้วhistory -chistory -r


3

สำหรับผู้ที่มองหาซับใน:

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

ดังนั้นถ้าคุณต้องการที่จะ ลบหลายบรรทัดด้วยรหัสผ่านเพียงแค่แทนที่ "SEARCH_STRING_GOES_HERE" ด้วยรหัสผ่าน นี่จะค้นหาประวัติทั้งหมดของคุณสำหรับสตริงการค้นหานั้นและลบทิ้ง

2 สิ่งที่ควรระวัง

  • grep ใช้ regex เว้นแต่คุณจะระบุ -F เป็นอาร์กิวเมนต์
  • คำสั่งจะแสดงข้อผิดพลาด 1 ครั้งเมื่อไม่มีการแข่งขันเพิ่มเติม ไม่ต้องสนใจมัน

ฉันได้รับข้อผิดพลาด (-bash: history: -d: ตัวเลือกต้องมีอาร์กิวเมนต์) แต่มันยังใช้งานได้หรือไม่
Paradroid

1
มันรันคำสั่งลบอย่างต่อเนื่องจนกว่ามันจะล้มเหลวด้วยข้อผิดพลาด (เพราะไม่มีอะไรจะลบอีกต่อไป) เพียงแค่ละเว้นข้อผิดพลาด
thelogix

นี่ไม่ใช่แค่ onliner เท่านั้น แต่ยังเป็นคำตอบง่ายๆ ใช่ไม่ต้องสับสนเกี่ยวกับhistory: -d: option requires an argumentข้อผิดพลาด! เป็นที่สิ้นสุดของ while loop => คาดไว้ - ใช้งานได้และโดยทั่วไปจะพูดว่า "ฉันไม่พบสิ่งใดเลย!" :)
jave.web

2

จากคำตอบของไมเคิลและคริสฉันก็ทำตามสิ่งต่อไปนี้ เพิ่มไปยังคุณ~/.bashrcไฟล์แล้วโหลดด้วยหรือ. ~/.bashrcsource ~/.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
}

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

สิ่งนี้ใช้ได้สำหรับฉัน history -c && history-a ไม่ได้โหลดไฟล์ประวัติอีกครั้งอย่างถูกต้องสำหรับฉัน ดังนั้นฉันเพิ่งออกจากเซสชั่นของฉันทันทีหลังจากเขียนไฟล์ประวัติเพื่อให้หนึ่งในหน่วยความจำไม่ได้เขียนทับมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.