दिए गए स्ट्रिंग से मेल खाते हुए इतिहास में कमांड कैसे हटाएं?


14

मुझे एक स्ट्रिंग से मेल खाते हुए अपने इतिहास की सभी कमांड हटाने की आवश्यकता है। मैंने कोशिश की:

$ 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। कोई त्रुटि नहीं, लेकिन कुछ भी नहीं हटाया गया। कोई भी समझा सकता है क्यों?
बजे

जवाबों:


19

historyआदेश सिर्फ अपने इतिहास फ़ाइल पर चल रही है, $HISTFILE(आमतौर पर ~/.historyया ~/.bash_history)। यह बहुत आसान होगा यदि आप बस उस फ़ाइल से लाइनें हटा दें, जिसे कई तरीके से किया जा सकता है। grepएक तरीका है, लेकिन आपको इसे पढ़ते समय फ़ाइल को अधिलेखित नहीं करने के लिए सावधान रहना होगा:

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

एक और तरीका है sed:

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

अच्छा उत्तर; $HISTFILEइसमें स्थान हो सकता है, शायद इसे उद्धृत करने लायक हो।
क्रिस डाउन

सावधान ... हिस्टफाइल अप्रत्याशित है, अगर आपके पास कई खुले गोले हैं, तो यह नहीं बता रहा है कि वास्तव में क्या बचाया जाएगा और किस क्रम में मिलेगा। क्या कोई पुष्टि कर सकता है कि पहले से ही खुले हुए गोले उस इतिहास को फिर से नहीं लिखेंगे जो उन्होंने प्रारंभ में लोड किया था, जब बंद किया गया था?
ओरियन

8

यदि आप वर्तमान सत्र से आदेशों को हटाने के बारे में परवाह नहीं करते हैं तो माइकल Mrozek का जवाब काम करेगा। यदि आप करते हैं, तो आपको उसकी पोस्ट में ऑपरेशन करने से पहले इतिहास फ़ाइल को लिखना चाहिए history -a

इसके अलावा, के बाद आप प्रविष्टियों है कि आप अपने इतिहास फ़ाइल से चाहते हैं हटा दिया है, तो आप इसे जारी करके पुनः लोड कर सकते history -c, तो history -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 एरर दिखाएगा। अनदेखी करो इसे।

मुझे एक त्रुटि मिली (-बैश: इतिहास: -d: विकल्प के लिए एक तर्क की आवश्यकता है), लेकिन यह अभी भी काम किया है?
पैराडाइरॉइड

1
यह डिलीट कमांड को लगातार चलाता है, जब तक कि यह एक एरर के साथ फेल न हो जाए (क्योंकि डिलीट करने के लिए ज्यादा कुछ नहीं है)। बस त्रुटि को नजरअंदाज करें।
thelogix

यह न केवल ऑनलाइनर है, बल्कि सही सरल उत्तर भी है। हां त्रुटि के बारे में भ्रमित मत हो history: -d: option requires an argument! यह लूप के अंत में है => अपेक्षित - यह काम करता है और फिर मूल रूप से कहता है "मुझे और कुछ नहीं मिल सकता है!" :)
jave.web

2

माइकल और क्रिस के जवाबों के आधार पर , मैं निम्नलिखित के साथ आया। यह अपने में जोड़े ~/.bashrcफ़ाइल और उसके बाद के साथ या तो इसे लोड . ~/.bashrcया 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
}

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

इसने मेरे लिए काम किया। इतिहास -c && इतिहास -a ने इतिहास फ़ाइल को मेरे लिए ठीक से लोड नहीं किया है। इसलिए इसके बजाय मैं सिर्फ इतिहास सत्र को फिर से लिखने के बाद अपने सत्र से बाहर निकल जाता हूं, इसलिए स्मृति में कोई इसे अधिलेखित नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.