बैश इतिहास फ़ाइल से एक निश्चित रेखा निकालें


जवाबों:


108

आपको लॉग आउट करने या वापस चलाने की आवश्यकता है history -aताकि वर्तमान इतिहास डिस्क के लिए प्रतिबद्ध हो।

तो बस फ़ाइल को संपादित करें ~/.bash_history


19
यदि HISTFILE वातावरण चर सेट किया गया है, तो इतिहास फ़ाइल ~ / .bash_history नहीं है, बल्कि $ {HISTFILE} है।
करोलोस

20
जब आप शेल से बाहर निकलते हैं तो प्रविष्टियाँ इतिहास फ़ाइल में लिखी जाती हैं। इसलिए, ऐसी कमांड दर्ज करने के बाद जिसे आप निकालना चाहते हैं, आपको वर्तमान शेल सत्र से निकालने के लिए या तो लॉग आउट करना होगा और वापस आना होगा या 'हिस्ट्री -d xxxx' का उपयोग करना होगा।
हानिकारक

3
लेकिन आप इतिहास फ़ाइल को संपादित करने का रिकॉर्ड कैसे हटाएंगे?
19-28 को

5
@chiliNUT: बस vim ~/.bash_historyएक स्थान के साथ अपनी कमांड (जैसे ) शुरू करें ; एक स्थान से शुरू होने वाली कमांड आमतौर पर लॉग इन नहीं होती है (देखें $HISTCONTROL)।
शुक्र

मुझे नहीं लगता कि मेरे वितरण में इस तरह का मामला है, लेकिन सामान्य रूप से इसका मतलब है
chiliNUT

149

आप दो चरणों में कमांडलाइन का उपयोग करके इतिहास फ़ाइल से निष्कासन प्राप्त कर सकते हैं:

  1. टंकण history -d <line_number>स्मृति में इतिहास से एक निर्दिष्ट रेखा हटाता है।
  2. टाइपिंग फ़ाइल history -wमें वर्तमान-मेमोरी इतिहास लिखता है ~/.bash_history

दो चरण एक साथ इन-मेमोरी इतिहास और .bash_history फ़ाइल से स्थायी रूप से लाइन को हटाते हैं


7
history -wइतिहास से अंतिम को कैसे हटाएं ?
क्रिश्ना ०

@KrIsHnA ~ ~ .bash_history मैन्युअल रूप से संपादित करें
अलेक्जेंडर मायशोव

5
या इसे जोड़ने से रोकने के लिए इससे पहले एक स्थान जोड़ें, जैसा कि @ ताओ के जवाब में
मार्क

जानने के लिए <line_number>सिर्फ history | grep [unwanted_content]सभी लाइनों से युक्त एक सूची प्राप्त करने [unwanted_content](पासवर्ड)।
AvL

आप कई (विशिष्ट) लाइनें (आईडी द्वारा) कैसे हटाते हैं?
पाथरोस

39

करने के लिए रोकने के लिए पहली जगह में इतिहास में शामिल होने से एक आदेश, सुनिश्चित करें कि वातावरण चर है कि HISTCONTROLअपने पेट के अलग किए गए मान के बीच मान ignorespace, उदाहरण के लिए (जोड़ने जैसे करने के लिए .bashrc):

$ export HISTCONTROL=ignorespace

यह किसी भी कमांड को एक प्रमुख स्थान के साथ इतिहास में जोड़े जाने से रोकेगा। फिर आप चलकर इतिहास को पूरी तरह से साफ़ कर सकते हैं

$  history -c -w
  ^-- additional space character

32

सबसे पहले, यदि आप जिस कमांड को जारी करने वाले हैं वह संवेदनशील, असुरक्षित है, या आपको इसे अपने इतिहास को अव्यवस्थित करने की आवश्यकता नहीं है, तो यह सबसे अच्छा है / इसे सबसे पहले इतिहास में दर्ज करने से रोकने के लिए सबसे तेज़ है। सुनिश्चित करें कि $HISTCONTROLइसमें शामिल हैं ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

फिर अपने इतिहास में किसी भी कमांड को स्पेस के साथ न रखें।

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

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

(bash)$  history -d $((HISTCMD-1))

अग्रणी स्थान पर ध्यान दें; इस आदेश की आवश्यकता है ignorespace, अन्यथा यह केवल स्वयं को हटा देगा!

यदि आप पिछले कुछ आदेशों को हटाना चाहते हैं, तो अंतिम और पहला इतिहास संख्या खोजें:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

इस मामले में 602 और 599। तब जारी करें:

(bash)$  for i in {602..599}; do history -d $i; done

(बिना ignorespace, यह 603..599 होगा।)

यदि आप डिस्क को हिट करने के लिए अपने वर्तमान सत्र से कोई इतिहास नहीं चाहते हैं , तो बाहर निकलें:

(bash)$ kill -9 $$

अब तक का दृष्टिकोण संवेदनशील इतिहास की वस्तुओं को अतिरिक्त सुरक्षा के लिए डिस्क पर लिखने की अनुमति नहीं देना है, क्योंकि सिद्धांत में गैर-वाष्पशील मीडिया से हटाए गए डेटा को अभी भी पुनर्प्राप्त किया जा सकता है।

हालाँकि, यदि आप जिस कमांड को हटाना चाहते हैं, वे पिछले सत्र से हैं, तो उन्हें पहले ही $HISTFILEबाहर निकलने के लिए जोड़ दिया गया होगा । ऊपर बताए गए आदेशों के साथ इतिहास से छेड़छाड़ अभी भी केवल जाएगा संलग्न शेष नया करने के लिए आइटम $HISTFILE, बाहर निकलने पर । करने के लिए ऊपर लिख$HISTFILE के चालू सत्र के दृश्य के साथ पूरे इतिहास, अभी , मुद्दा:

(bash)$  history -w

बेशक पहले से ही डिस्क पर इतिहास की वस्तुओं के लिए, history -dफिर आदेश जारी करने के साथ इतिहास को संपादित करने का विकल्प history -w, $HISTFILEएक पाठ संपादक के साथ संपादित करना है ।


1
"ऊपर आदेशों के साथ इतिहास से छेड़छाड़ अभी भी केवल जाएगा संलग्न शेष नया करने के लिए आइटम $HISTFILE, बाहर निकलने पर ।" वास्तव में, यह वास्तव में सच नहीं है। यह केवल शेष नई वस्तुओं को जोड़ने के लिए लगता है जो मूल इतिहास की लंबाई से 'चिपके रहते हैं'। उदाहरण के लिए, यदि मैं 5 मूल आइटम निकालता हूं और 15 नए जोड़ देता हूं, तो केवल अंतिम 10 नए जोड़े जाते हैं, जबकि मुझे उम्मीद है कि सभी 15 नए जोड़े जाएंगे। मुझे लगता है कि यह एक बग है क्योंकि मैं नहीं देख सकता कि यह कैसे वांछनीय कार्यक्षमता है।
जेम्स हाई

1
मुझे लगता है कि बैश मूल लंबाई पर ध्यान देता है। सत्र बंद होने पर, यह संभवतः उन वस्तुओं को जोड़ता है जिनकी संख्या इस मान से अधिक है। यदि हर बार किसी आइटम को हटा दिया जाता है, जिसकी संख्या इस मूल्य से कम या उसके बराबर होती है, तो यह अपेक्षा के अनुरूप काम करेगा। ;-)
जेम्स हाई

15

कई तकनीकें:

इतिहास फ़ाइल में संग्रहीत होने से संवेदनशील जानकारी को रोकें

यदि आपने कमांड लाइन पर कुछ पासवर्ड डाला है, तो महसूस करें कि सभी कमांड लॉग इन हैं, आप या तो कर सकते हैं:

  1. इतिहास को सहेजे बिना वर्तमान सत्र से बाहर निकलें:

     kill -9 $$

    यह सभी वर्तमान इतिहास को छोड़ देगा।

  2. ↑ (up arrow)ओपन बैश सत्र में टाइप करें जब तक संवेदनशील जानकारी नहीं दिखाई जाती है, तब संवेदनशील जानकारी को हटाने के लिए Ctrl+ की तरह लाइन एडिटिंग कीस्ट्रोक्स का उपयोग करें W, और तब ↓ (down arrow) तक टाइप करने से पहले एक नई खाली लाइन का संकेत दिया जाए Enter

इतिहास फ़ाइल से संवेदनशील जानकारी हटाएं

यदि आपको पता चलता है कि संवेदनशील जानकारी पहले से संग्रहीत है, और आप इसे हटाना चाहते हैं, लेकिन आपका पूरा इतिहास नहीं:

एक साधारण sedआदेश काम कर सकता है:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

लेकिन, जैसा कि आप इसे टाइप करते हैं, आप एक अन्य इतिहास लाइन बनाते हैं जिसमें खोज पैटर्न (संवेदनशील जानकारी) जिसे आप हटाने की कोशिश कर रहे हैं। तो आप कर सकते हैं:

sed -e "/$(head -n1)/d" -i .bash_history

यह head -n1टर्मिनल से इनपुट के साथ चलेगा । यह दिखाई देगा कि आपका टर्मिनल लटका हुआ है (कोई संकेत नहीं होगा); बस वह जानकारी टाइप करें जिसे आप फ़ाइल से हटाना चाहते हैं। यह एक चाल है जो आपको वास्तव में कमांड लाइन में टाइप किए बिना एक कमांड दर्ज करने की अनुमति देता है (इस प्रकार) इसे रिकॉर्ड में शामिल करने के लिए अयोग्य बना दिया जाता है। फिर sedउस पाठ का उपयोग करेंगे जिसे आपने .bash_history संवेदनशील जानकारी वाली सभी पंक्तियों को खोजने और हटाने के लिए टाइप किया था । नोट: यदि आपके संवेदनशील सूचना पैटर्न में स्लैश (es) हैं, तो आपको उन्हें बैकस्लैश के साथ बचना चाहिए, अन्यथा sedइस सिंटैक्स का उपयोग करने के लिए कमांड को बदलकर एक सीमांकक निर्दिष्ट करें जो पैटर्न में प्रकट नहीं होता है:

sed -e "\|$(head -n1)|d" -i .bash_history

एक और तरीका केवल संवेदनशील जानकारी को हटाने के लिए हो सकता है, लेकिन उन कमांड को रखें जिनमें जानकारी होती है। इसके लिए, आप संवेदनशील जानकारी को अपनी पसंद के स्थानापन्न पाठ से बदल सकते हैं:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

किसी विशिष्ट पेड़ की किसी भी फ़ाइल से संवेदनशील जानकारी हटाएं

अंत में, यह सुनिश्चित करने के लिए कि यह दूसरी भूली हुई फ़ाइल में नहीं रहेगा :

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

सभी संबंधित फाइलों को सूचीबद्ध करेगा।

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

रूट किए गए निर्देशिका ट्री में सभी फ़ाइलों में संवेदनशील जानकारी की सभी घटनाओं को प्रतिस्थापित करेगा .। नोट: भले ही यह कमांड का उपयोग करता है xargs -0, यह अपने नाम में नई सुर्खियों वाली फाइलों को संभाल नहीं पाएगा।


11

↑ (up arrow)जब तक यह दिखाई न दे तब तक आप जिस लाइन को हटाना चाहते हैं, उसका पता लगाएँ , फिर Ctrl+ दबाएँ U। कि लाइन को हटा देना चाहिए।

यदि आप historyकमांड का उपयोग करते हैं , तो आप देख सकते हैं कि लाइन को तारांकन चिह्न के साथ प्रतिस्थापित किया गया है।


2
वास्तव में, मेरा मानना ​​है कि आपको लाइन में कर्सर करना होगा, Ctrl + U दबाएं, और फिर दूसरी पंक्ति में ऊपर या नीचे कर्सर करें (संभवतः सूची के निचले भाग में रिक्त)। इसके अलावा, कड़ाई से बोलते हुए, लाइन को तारांकन के साथ प्रतिस्थापित नहीं किया गया है। बल्कि, कमांड को मिटा दिया गया है, और इतिहास संख्या को ए के साथ जोड़ा गया है *
जी-मैन

1
यह Ctrl + R (रिवर्स वृद्धिशील इतिहास खोज) के साथ बहुत अधिक शक्तिशाली हो जाता है, फिर उदाहरण के लिए [End], Ctrl + U
sehe

4

यदि आपको एक ही समय में कई पंक्तियों को हटाने की आवश्यकता है तो मैं सामान्य रूप से इसका उपयोग करता हूं:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

यदि आपको अंतिम कमांड को निकालने की आवश्यकता है, जिसका आप उपयोग कर सकते हैं:

history -d $((HISTCMD-2))

2
ऐसा लग रहा था कि यह काम कर रहा है, लेकिन फिर history | grep <string>भी यह सभी लाइनों को दिखाता है जो इसे हटाने का दावा करता है ...
ब्रॉक हेंसले

1
यह गलत इतिहास लाइनों को हटाने के बाद fisrt को हटा देगा !!
mivk 14

1
लेकिन सौभाग्य से, यह केवल गलत डिलीट कमांड को प्रिंट करता है। निम्नलिखित सही हटाने आदेशों प्रिंट होगा:history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
mivk

3

यदि आपको इतिहास से कई लाइनों को हटाने की आवश्यकता है, तो निम्नलिखित बैश फ़ंक्शन आपको कुछ समय बचा सकता है:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

फ़ंक्शन को आम तौर पर जोड़ा जाना चाहिए $HOME/.bashrc। फ़ंक्शन imediatelly का उपयोग करने के लिए, आपको अपने रनिंग शेल ( . $HOME/.bashrc) द्वारा फ़ाइल को फिर से पढ़ना होगा । फिर इतिहास से 200-210 आदेशों को हटाने के लिए:

$ histdel 200 210

(नोट: यह सवाल शीर्ष खोज परिणामों में से है यदि आप बैश इतिहास से कई कमांड को हटाने के लिए खोज करते हैं। इसलिए, जबकि ऊपर जो सवाल पूछता है उससे अधिक है, यह कुछ पाठकों के लिए उपयोगी हो सकता है।)


3
forकथन के लिए वैकल्पिक रूप : for n in $(seq "$2" "$1")कुछ के द्वारा शैलीगत रूप से पसंद किया जाता है, और, यदि seqकाम नहीं करता है , तो प्रयास करें for ((n="$2"; n>="$1"; n--))
स्कॉट

3
history | sed -i 59d

59 लाइन नंबर है। इससे ज्यादा मीठा कुछ नहीं हो सकता :)


3

बस इन्हें आज़माएं,

$ history

यह इतिहास और कमांड की आईडी प्रदर्शित करेगा, जैसे



211 ls
212 javac Welcome.java
213 जावा स्वागत है

उपयोग,

$ history -d 211

यहां 211 इतिहास की पहचान है। अब इस का उपयोग कर की जाँच करें

$ history



211 javac Welcome.java
212 जावा का स्वागत है


2

मुझे पता है कि यह प्रश्न पूछे जाने और जवाब दिए जाने में काफी समय हो गया है, लेकिन मैं आपको अपनी इतिहास फ़ाइल को साफ करने और उसी समय लॉग आउट करने के लिए अपना तरीका दिखाऊंगा।

मै भागा : history -w && nano "${HISTFILE}" && history -c && exit

यह क्या सरल है:

  1. history -w : अंदर कैश्ड इतिहास लिखता है "${HISTFILE}"
  2. nano "${HISTFILE}": मुझे संपादित करने की अनुमति दें "${HISTFILE}"आप एक सीड स्क्रिप्ट का उपयोग कर सकते हैं या जो कुछ भी अपने को साफ करना चाहते हैं"${HISTFILE}"
  3. history -c : कैश्ड हिस्ट्री क्लियर हो इसलिए यह आखिरी कमांड नहीं है।
  4. exit : मुझे लॉग इन कैश्ड हिस्ट्री ... लेकिन यह खाली है;)

उस आदेश के बाद, आपको एक साफ इतिहास फ़ाइल के साथ लॉग आउट किया जाएगा। अपना इतिहास जांचने के लिए लॉग इन करें;)

मुझे उम्मीद है कि यह किसी की मदद करेगा।


1

आप इतिहास फ़ाइल को सीधे संपादित भी कर सकते हैं, जैसे nano .bash_historyकि यदि आप बैश शेल में हैं?

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