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


मैं एक निश्चित रेखा को कैसे हटा सकता हूं historyडेटाबेस है?


130
2018-01-31 15:43


मूल




जवाब:


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

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


97
2018-01-31 16:01



यदि HISTFILE पर्यावरण चर सेट किया गया है, तो इतिहास फ़ाइल ~ / .bash_history नहीं बल्कि $ {HISTFILE} है। - Karolos
जब आप खोल से बाहर निकलेंगे तो प्रविष्टियां इतिहास फ़ाइल में लिखी जाती हैं। इसलिए, उस आदेश को दर्ज करने के बाद जिसे आप निकालना चाहते हैं, आपको या तो लॉग आउट और बैक इन करने की आवश्यकता है, या मौजूदा शैल सत्र से उन्हें हटाने के लिए 'history -d xxxx' का उपयोग करना होगा। - harmic
लेकिन आप इतिहास फ़ाइल को संपादित करने के रिकॉर्ड को कैसे हटा देंगे? - chiliNUT
@chiliNUT: बस अपना आदेश शुरू करें (उदा। vim ~/.bash_history) एक जगह के साथ; एक स्थान से शुरू होने वाले आदेश आमतौर पर लॉग नहीं होते हैं (देखें $HISTCONTROL)। - cYrus
मुझे नहीं लगता कि मेरे वितरण में मामला है, लेकिन आम तौर पर यह समझ में आता है - chiliNUT


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

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

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


141
2018-01-31 16:09



अंतिम को कैसे हटाएं history -w इतिहास से? - KrIsHnA
@KrIsHnA मैन्युअल रूप से ~ / .bash_history संपादित करें - Alexander Myshov
या इसे जोड़ने से रोकने के लिए इससे पहले एक जगह जोड़ें, जैसा कि @ ताओ के उत्तर में है - Mark
ढूँढ़ने के लिए <line_number> केवल history | grep [unwanted_content] सभी लाइनों के साथ एक सूची प्राप्त करने के लिए [unwanted_content] (पासवर्ड की तरह)। - AvL
आप एकाधिक (विशिष्ट) लाइनों (आईडी द्वारा) कैसे हटाते हैं? - Pathros


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

$ export HISTCONTROL=ignorespace

यह इतिहास में जोड़े जाने से अग्रणी स्थान के साथ किसी भी कमांड को रोक देगा। फिर आप दौड़कर इतिहास को पूरी तरह साफ़ कर सकते हैं

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

37
2018-02-01 22:19





सबसे पहले, यदि आप जिस आदेश को जारी करने वाले हैं, वह संवेदनशील, असुरक्षित है, या आपको अपने इतिहास को अपनाने की आवश्यकता नहीं है, तो इसे इतिहास में प्रवेश करने से रोकने के लिए सबसे अच्छा / तेज़ है। निश्चित करें कि $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 और 59 9। फिर जारी करें:

(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 एक पाठ संपादक के साथ।


30
2018-06-18 16:33



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


कई तकनीकें:

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

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

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

     kill -9 $$
    

    यह सभी मौजूदा इतिहास छोड़ देगा।

  2. प्रकार ↑ (ऊपर तीर) संवेदनशील जानकारी दिखाए जाने तक खुले बैश सत्र में, फिर लाइन संपादन कीस्ट्रोक का उपयोग करें Ctrl+डब्ल्यू संवेदनशील जानकारी को हटाने के लिए, और फिर  ↓ (नीचे तीर) जब तक एक नई खाली रेखा को संकेत नहीं दिया जाता है, से पहले टाइपिंग दर्ज

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

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

एक सरल sed आदेश नौकरी कर सकता है:

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

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

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

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


14
2017-07-19 12:50





उस रेखा को ढूंढें जिसे आप दबाकर हटाना चाहते हैं ↑ (ऊपर तीर) जब तक यह प्रकट नहीं होता है, तब दबाएं Ctrl+यू। उस रेखा को हटा देना चाहिए।

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


10
2018-04-01 16:00



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


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

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

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

history -d $((HISTCMD-2))

4
2018-01-07 05:53



ऐसा लगता है कि यह काम किया लेकिन history | grep <string> अभी भी उन सभी लाइनों को दिखाता है जिन्हें उन्होंने हटाने का दावा किया ... - Brock Hensley
यह fisrt हटाने के बाद गलत इतिहास लाइनों को हटा देगा !! - mivk
लेकिन सौभाग्य से, यह केवल गलत हटाए गए आदेशों को प्रिंट करता है। निम्नलिखित सही हटाने के आदेश मुद्रित करेंगे: history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}' - mivk


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

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
2017-10-26 14:09



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


history | sed -i 59d

59 लाइन संख्या है। इस से कुछ भी मीठा नहीं हो सकता :)


3
2018-04-03 21:16





बस इन कोशिश करो,

$ history

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


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

उपयोग,

$ history -d 211

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

$ history


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


3
2018-03-04 11:16





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

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

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

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

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

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


2
2017-09-30 04:57