बैश इतिहास से चयनित परिणाम कैसे हटाएं?


66

historyकमांड सभी परिणाम दिखाता है लेकिन हम विशेष कमांड का उपयोग करके फ़िल्टर कर सकते हैं history | grep searchingCommand। यह वास्तव में मददगार है।

लेकिन समस्या यह है कि यह उन कमांडों को भी दिखाता है जो टाइपो त्रुटि के साथ दर्ज किए गए थे या जो असफल थे। फिर सही की पहचान करना वास्तव में एक दर्द है। मैंने इस लिंक की जाँच की: टर्मिनल में चयनात्मक कमांड-इतिहास? लेकिन वह मेरा समाधान नहीं था।

तो क्या इतिहास से उन आदेशों को हटाने का एक तरीका है जो दर्ज किए गए या बाद में गलत थे?


5
कृपया, स्वीकार किए गए उत्तर को बदल दें, और भी 100 वोट हैं।
greuze

1
@greuze: सर्वश्रेष्ठ उत्तर में बदल गया। वोटों की गिनती का मतलब यह नहीं है कि यह सबसे अच्छा है!
सौरव कुमार

जवाबों:


20

मैं इतिहास प्रविष्टियों को संशोधित करने (या हटाने) का एक और तरीका जोड़ना चाहता हूं, जो मुझे गलती से मिला जब मैं बैश के साथ काम कर रहा था:

इसे प्रदर्शित करने के लिए, निम्नलिखित तीन आदेशों को bash में निष्पादित करके शुरू करें:

$ echo 1
1
$ echo 2
2
$ echo 3
3

अब आप तीर कुंजियों या Ctrl+ pऔर Ctrl+ का उपयोग करके फिर से इन कमांड्स का चयन कर सकते हैं n

मान लें कि आप पहले दो आदेशों को संशोधित करना चाहते हैं। echo 1प्रकट होने तक इतिहास में ले जाएँ और इसे बदल दें echo 1 - changed, लेकिन दर्ज न करें। यदि आप अब अपने इतिहास के माध्यम से आगे बढ़ते हैं, तो यह रेखा अपनी संशोधित स्थिति में रहती है और आप इससे दूर और पीछे जा सकते हैं। अब लाइन पर जाएं echo 2और इसे बदल दें echo 2 - changed, फिर से एंटर न करें। इन पंक्तियों के परिवर्तनों को सहेजने के लिए, इन दोनों को छोड़कर इतिहास में किसी भी आदेश का चयन करें, और हिट Ctrl+ c

बेशक, इतिहास प्रविष्टि को संशोधित करने के बजाय, आप इसे हटा भी सकते हैं जिसके परिणामस्वरूप उस प्रविष्टि पर एक खाली रेखा होगी। प्रॉम्प्ट पर वर्तमान में प्रदर्शित लाइन को हटाने के लिए, हिट Ctrl+ e(जो लाइन के अंत में कूदता है) उसके बाद Ctrl+ u(जो लाइन के प्रारंभ से कर्सर तक पाठ को हटाता है)।

अधिक विस्तृत विवरण के लिए https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-my-bash-history/195726/195726 भी देखें तकनीकी पृष्ठभूमि।

सबसे सरल तरीका:

  1. ctrl+ rउस कमांड को खोजने के लिए जिसे आप हटाना / संशोधित करना चाहते हैं।
  2. end हटाने / संशोधित करने के लिए खोज की गई कमांड का चयन करें
  3. हटाएं या चयनित आदेश (प्रेस नहीं है संशोधित enterया ctrl+ c)
  4. किसी भी अन्य कमांड को चुनने के लिए ऊपर तीर (या ctrl+ p) या नीचे तीर (या ctrl+ n)।
  5. ctrl+ c यह बात है!

नोट :

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

history -w

बहुत धन्यवाद स्टीफन! मुझे कहना होगा कि आप एक भयानक चीज लाए हैं। इसके उपयोग से मुझे इतिहास को संशोधित / हटाने का सबसे सरल तरीका मिल गया: 1.ctrl+r आप जिस कमांड को हटाना / संशोधित करना चाहते हैं उसे खोजना। 2.end कमांड को स्थानांतरित करने और कमांड को हटाने / संशोधित करने के लिए। 3.ctrl+n अगली पंक्ति में जाने के लिए और फिर 4.ctrl+c
सौरव कुमार

144

उपयोग:

history -d OFFSET

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

और इतिहास के उपयोग के संशोधनों को बचाने के लिए:

history -w

इस गाइड में अधिक विवरण देखें ।


बुरा नहीं है :) एक नया तरीका पाने के लिए अच्छा है ..
सौरव कुमार

10
@ सौरवकुमार बुरा नहीं है? संभवत: सबसे अच्छा तरीका है ...
रादु रएडेनु

5
पहले पढ़ें: स्पष्ट होने के लिए आपको history -wपरिवर्तनों को सहेजने के लिए afterwords करना चाहिए । इसके अलावा OFFSET का मतलब है कि कौन सी संख्या historyप्रदर्शित करती है। यदि आप जिस लाइन को हटाने की कोशिश कर रहे हैं वह 873 है तो उपयोग करें history -d 873
Cammy_the_block 16

2
@ RaduRădeanu परिवर्तनों को सहेजने के history -wबाद उपयोग करें history -d
कैममी_थेब्लॉक 16

20
यह सही उत्तर होना चाहिए।
Topher

19

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

उदाहरण के लिए, यह कमांड डालें:

gedit ~/.bash_history

फ़ाइल को सहेजने और टर्मिनल को पुनरारंभ करने के बाद आपको जो पसंद है उसे संपादित करें। रूट कमांड है:

sudo -i 
inser your password
gedit ~/.bash_history

यदि आप सभी को हटाना चाहते history -cहैं तो चाल चलनी चाहिए


वाक्य - विन्यास

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

चाभी

इतिहास सूची साफ़ करें। इसे इतिहास की सूची को पूरी तरह से बदलने के लिए अन्य विकल्पों के साथ जोड़ा जा सकता है।

-d ऑफ़सेट स्थिति ऑफ़सेट पर इतिहास प्रविष्टि हटाएं। ऑफ़सेट निर्दिष्ट किया जाना चाहिए क्योंकि यह तब दिखाई देता है जब इतिहास प्रदर्शित होता है।

-a इतिहास फ़ाइल में नई इतिहास लाइनों (वर्तमान बैश सत्र की शुरुआत के बाद से दर्ज की गई इतिहास लाइनें) को लागू करें।

-एन इतिहास की पंक्तियों को इतिहास फ़ाइल से वर्तमान इतिहास सूची में न पढ़े। ये मौजूदा बैश सत्र की शुरुआत के बाद से इतिहास फ़ाइल में संलग्न हैं।

-r वर्तमान इतिहास फ़ाइल पढ़ें और इतिहास सूची में इसकी सामग्री संलग्न करें।

इतिहास फ़ाइल में वर्तमान इतिहास लिखें।

इतिहास सूची में परिणाम संग्रहीत किए बिना, पीजी पर इतिहास प्रतिस्थापन प्रदर्शन करें और मानक आउटपुट पर परिणाम प्रदर्शित करें।

-s इतिहास प्रविष्टि के अंत में एकल प्रविष्टि के रूप में आर्ग जोड़े जाते हैं।

स्रोत :


धन्यवाद यह मददगार है! क्या आप जानते हैं कि कमांड लाइन से प्रवेश करने के समय प्रविष्टि को कैसे हटाया जाए? या क्या बिना ओपनिंग के एंट्री डिलीट करने का कोई कमांड है .bash_history?
सौरव कुमार

1
@ bladed19899 history -cकाम नहीं करता है जब मैं टर्मिनल बंद करता हूं और इसे फिर से खोलता हूं तो इतिहास हटाए नहीं जाते हैं। -1 आपका जवाब
αғsнιη

1
@ कसिया, -c Clear the history list. This may be combined with the other options to replace the history list completely. स्रोत
ब्लेड

2
@ KasiyA परिवर्तनों को लिखने के history -wबाद उपयोग करें history -c
Cammy_the_block

16

यदि आप इसे तुरंत हटाना चाहते हैं तो उसी टर्मिनल को बनाएं, पहले आपको अपनी ~ / .bashrc फ़ाइल में निम्न जोड़ना होगा।

PROMPT_COMMAND='history -a' 

और अपने टर्मिनल को पुनरारंभ करें।

आप इसे .bashrc फ़ाइल में कहीं भी जोड़ सकते हैं। मैंने इतिहास से संबंधित अन्य सामग्री के साथ नीचे जोड़ा है।

यहाँ छवि विवरण दर्ज करें

आमतौर पर एक बैश सत्र के दौरान निष्पादित कमांड को तब तक नहीं लिखा जाता है, जब तक कि सत्र समाप्त PROMPT_COMMAND='history -a'नहीं हो जाता है।

अब जब भी आप किसी कमांड में गलती या त्रुटि करते हैं और तब उसे हटाना चाहते हैं और निम्नलिखित को निष्पादित करते हैं

sed -i '$d' ~/.bash_history

और टाडा इसे हटा दिया जाएगा।

इसे सरल बनाने के लिए, आप इसे कुछ और सरल बनाने के लिए इसे उर्फ ​​कर सकते हैं और इसका उपयोग कर सकते हैं जैसे कि

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

इसलिए निष्पादित करने rhसे अंतिम निष्पादित कमांड को इतिहास से हटा दिया जाएगा।

उपरोक्त अस्थायी अलियासिंग है जो केवल एक सत्र के लिए रहता है। इसे स्थायी या लगातार जोड़ने के लिए

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

.bashrc को

ध्यान दें

के दोनों तरफ कोई जगह नहीं होनी चाहिए =

यदि आप उपनाम नहीं चाहते हैं तो आप निम्न कार्य भी कर सकते हैं

एक नाम बनाएं rhऔर इसे /binनिर्देशिका में रखें:

  • एक फाइल खोलें rhऔर निम्नलिखित कोड पेस्ट करें, सहेजें और बंद करें:

    sed -i '$d' ~/.bash_history

  • rhनिष्पादन योग्य बनाएं और इसे /binनिर्देशिका में रखें:

     chmod + x rh
     सुडो cp आरएच / बिन 
  • अब rhइतिहास से हालिया कमांड को हटाने के लिए कमांड का उपयोग करें ।


फ़ाइल PROMPT_COMMAND='history -a'में कहाँ जोड़ें .bashrc? और वास्तव में यह क्या करेगा? मैंने कोशिश की sed -i '$d' ~/.bash_historyकि यह बिना संपादन के काम करे .bashrc!! लेकिन उर्फ ​​बात काम नहीं कर रही है .. मैं आपके उत्तर को स्वीकार करूंगा यदि आप मेरे प्रश्न को विस्तृत करते हैं और उपनाम काम करते हैं .. :)
सौरव कुमार

@ सौरवकुमार ने जवाब को संपादित किया है। अलियासिंग कमांड में सिंगल और डबल कोट्स से चूक गए थे .. मेरा बुरा ..: पी
स्टॉर्मविरक्स

मेरा विश्वास करो या नहीं .. उपनाम की बात अभी भी काम नहीं कर रही है .. यह किसी भी त्रुटि के बिना निष्पादित करता है लेकिन .bash_historyफ़ाइल से प्रविष्टि को नष्ट नहीं करता है ..: पी किसी भी तरह से .. कोई समस्या नहीं है .. मैंने अपनी खुद की कमांड बनाई और इसे अंदर रखा /binनिर्देशिका। चूंकि आपकी आज्ञा के कारण: sed -i "$d" ~/.bash_historyयह ठीक काम कर रहा है। मैं आपका उत्तर स्वीकार करता हूं .. :)
सौरव कुमार

अगर आप बुरा न मानें, तो मैं आपके उत्तर को संपादित करना चाहूंगा, ताकि यह दूसरों के लिए उपयोगी हो ..
सौरव कुमार

वास्तव में मैंने इसे संपादित किया। आपको यह मंजूर है ..
सौरव कुमार

2

कई लाइनों को हटाने के लिए (जैसे 1974 से 1990 तक, historyकमांड के साथ जांच करें ):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

ध्यान दें कि निकालने के लिए लाइन नंबर हमेशा समान होता है, क्योंकि आप उस एक को हटा रहे हैं और अगले पर जाएं।


नोट बहुत महत्वपूर्ण है।
वीजुन झोउ

1

यदि आप bash में "set -o vi" विकल्प का उपयोग कर रहे हैं (एस्केप कुंजी के साथ वापस खोज करने के लिए बहुत उपयोगी है), तो आप लाइन की खोज कर सकते हैं और लाइन को "dd" के साथ हटा सकते हैं उसी तरह जो आप "vi" में करते हैं।


मुझे लगता है कि मुझे इतिहास से कमांड को स्पष्ट करने के लिए jया kउसके बाद टाइप ddकरना है। यदि मैं एक और कमांड टाइप करता हूं, या बस प्रेस करता हूं Enter, तो लगता है कि यह सिर्फ एक नई कमांड है और इसे इतिहास में पुरानी कमांड को बरकरार रखना चाहिए। यह भी ध्यान रखना दिलचस्प है कि जब यह सही किया जाता है, तो यह कमांड को साफ करता है, लेकिन इसे हटाता नहीं है - परिणाम रिक्त इतिहास प्रविष्टियां है। लेकिन यह पासवर्ड हटाने के लिए पर्याप्त है जिसे मुझे कमांड लाइन पर टाइप करने के लिए मजबूर किया गया था, और अन्य उत्तरों की तुलना में बहुत आसान है, इसलिए इसे पोस्ट करने के लिए बहुत बहुत धन्यवाद!
माइकल शेपर

0

मेरे पास एक ऐसी स्थिति थी जहां मैंने अपने बैश इतिहास में एक Yubikey- शायद 50 या तो, 'ccccc .....' का मिलान किया था। आदर्श रूप से, मैं एक पैटर्न से मेल खाने वाली प्रविष्टियों को हटाने का एक तरीका चाहता था, जो मुझे लगता है कि आप अपने इतिहास को नजरअंदाज कर सकते हैं।

वैसे भी, मैं आलसी हो गया और हर मैच के दौरान साइकिल चलाते हुए विम का उपयोग करते हुए, 'cccc' की खोज और 'dd' का उपयोग करते हुए समाप्त हो गया। एक मिनट से अधिक नहीं लिया।


1
यदि आप ऐसा कर रहे हैं तो आप यह भी कर सकते हैं: g / cccc / d या: g / ^ cccc / d: या मैक्रो qqnddq का उपयोग करें तब @@ (आपकी अंतिम खोज ccccc के लिए थी)।
htaccess

@htaccess यह निश्चित रूप से आसान होगा, लेकिन मैं एक ही समय में बाकी फ़ाइल का नेत्रहीन निरीक्षण करना चाहता था।
Dylan_Larkin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.