शेल में पिछले 10 कमांड के इतिहास को कैसे हटाएं?


131

आज्ञा का पालन करता है

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

मैं एक सिंगल डिलीट कर सकता हूं history -d 511, लेकिन पिछले 10 कमांड्स और 10 कमांड्स हिस्ट्री में सिंगल कमांड का इस्तेमाल करके कैसे डिलीट करें?

क्या हम इतिहास को हटाने के लिए बैश स्क्रिप्ट लिख सकते हैं और निष्पादित कर सकते हैं?


18
vi $HISTFILEऔर जो आप चाहते हैं उसे हटा दें। head -n -10यदि आपको इसे स्वचालित करना है तो उपयोग करें ।
एंटन कोवलेंको

क्या यह सवाल ऑफ टॉपिक है ? या इस तरह का सवाल पूछने के लिए यह राइट जगह नहीं है? यदि हां, तो मुझे यह सवाल कहां पूछना चाहिए, मेरा मतलब है कि स्टैक एक्सचेंज में कहां है?
जस्टिन जॉन

1
शेल कमांड वही काम करते हैं चाहे आप स्थानीय रूप से लॉग इन करें या ssh के माध्यम से।
बमर

2
Unix और Linux StackExchange (unix.stackexchange.com) शायद इस सवाल का एक बेहतर स्थान है। यह यहां ऑफ-टॉपिक है क्योंकि यह प्रोग्रामिंग से कड़ाई से संबंधित नहीं है।
डैन मोल्डिंग

4
शेल स्क्रिप्ट का प्रोग्रामिंग इस प्रश्न का आदर्श समाधान है, फलस्वरूप इसे प्रोग्रामिंग से संबंधित माना जाना चाहिए। इस तथ्य का उल्लेख नहीं करने के लिए कि ओपी ने वास्तव में एक स्क्रिप्ट के लिए विशेष रूप से पूछा।
एसएसएच इस

जवाबों:


109

क्या आपने इतिहास फ़ाइल को सीधे संपादित करने की कोशिश की है:

~/.bash_history

2
@WherethereisaWill ओपी एक स्क्रिप्ट चाहता था, न कि मैनुअल प्लग और चुग।
टायलर जंद्रेउ

10
टर्मिनल को फिर से
चालू

8
यदि आप ऐसा करते हैं, तो आपको अपना विलोपन इतिहास मिल सकता है, ~/.viminfoइसलिए इसे भी हटा दें!
वाल्टवुड

5
कभी-कभी इसे स्मृति में रखा जाता है और किसी भी मैनुअल एडिटिंग को अगले लॉगिन के बाद जारी नहीं रखा जा सकता है ..
सुपर हीरो

5
@FizerKhan मेरा मतलब है कि जो बदलाव किए गए .bash_historyहैं उन्हें स्मृति में रखा जा सकता है। मुझे यह समाधान मददगार लगा: superuser.com/a/384383/253543
सुपरहीरो

73

मेरा उत्तर पिछले उत्तरों पर आधारित है, लेकिन अनुक्रम को उलटने के अलावा ताकि इतिहास की वस्तुओं को हाल के सबसे कम से कम हाल ही में हटा दिया जाए।

अपना वर्तमान इतिहास प्राप्त करें (उन पंक्तियों की संख्या को समायोजित करें जिन्हें आप देखना चाहते हैं):

history | tail -n 10

यह मुझे कुछ ऐसा देता है

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

जिन आइटम को आप हटाना चाहते हैं, उनके लिए शुरुआत और अंत की स्थिति चुनें। मैं एंट्री 1006 से 1008 डिलीट करने जा रहा हूं।

for h in $(seq 1006 1008); do history -d 1006; done

यह history -d1006 के लिए कमांड उत्पन्न करेगा , फिर 1007 1006 हो जाता है और 1006 हटा दिया जाता है, फिर 1008 (1007 बन गया) अब 1006 हो जाता है और हटा दिया जाता है।

अगर मैं भी हिस्ट्री डिलीट कमांड डिलीट करना चाहता हूं तो यह थोड़ा अधिक जटिल है क्योंकि आपको वर्तमान अधिकतम इतिहास प्रविष्टि जानने की आवश्यकता है।

आप इसे प्राप्त कर सकते हैं (बेहतर तरीका हो सकता है):

history 1 | awk '{print $1}'

इसे एक साथ रखकर आप एक सीमा को हटाने के लिए इसका उपयोग कर सकते हैं, और इतिहास हटाएं कमांड को हटा सकते हैं:

for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')

अपने को जोड़ने के लिए फ़ंक्शन में यह सब लपेटें ~/.bashrc:

histdel(){
  for h in $(seq $1 $2); do
    history -d $1
  done
  history -d $(history 1 | awk '{print $1}')
  }

उदाहरण 4, 5 और 6 (1049-1051) को हटाना और साक्ष्य छिपाना:

[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

प्रश्न वास्तव में इतिहास से अंतिम 10 आदेशों को हटाने के लिए था, इसलिए यदि आप थोड़ा प्रयास करना चाहते हैं तो आप फ़ंक्शन को कॉल करने के लिए एक और फ़ंक्शन का उपयोग कर सकते हैं histdelजो आपके लिए गणना करता है।

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

यह फ़ंक्शन 1 तर्क लेता है, हटाने के लिए पिछले इतिहास आइटमों की संख्या। तो पिछले 10 कमांड को इतिहास से हटाने के लिए उपयोग करें histdeln 10


history | tail -1 | awk '{print $1}'को सरल किया जा सकता हैhistory 1 | awk '{print $1}'
जॉर्ज हिलियार

-bash: tac: command not foundमैक OSX पर, अन्यथा यह सबसे अच्छा जवाब होगा।
Zim

for h in $(seq 1006 1008); do history -d 1006; doneयह ubuntu 16.04
महफूज

लघु लेकिन मीठा:for i in {1..10}; do history -d $(($HISTCMD-11)); done
कीमिया

30
for x in `seq $1 $2`
do
  history -d $1
done

3
पहले तर्क के लिए उच्च संख्या का उपयोग करना सुनिश्चित करें या आप हर दूसरे कमांड को हटा देंगे। जैसे जब कमांड 511 हटा दिया जाता है, तो सबकुछ शिफ्ट हो जाता है तो 512 नया 511 बन जाता है और 513 नया 512 history -d 511है। इसके बाद उम्मीद के मुताबिक काम करता है, फिर history -d 512जो 513 हुआ करता था, उसे डिलीट कर देता है और 512 कमांड 511 के रूप में इतिहास में रहता है। आशा है कि यह समझ में आता है। ।
मैथ्यू

5
@ मैथ्यू यह जरूरी नहीं है। मैं $xहर बार लूप के माध्यम से नहीं हटा रहा हूं, मैं हटा रहा हूं $1। तो यह पहले 511 हटाता है, और 512 511 हो जाता है। फिर यह 511 फिर से हटाता है, और इसी तरह।
बमर

@ मैथ्यू ने नोटिस किया कि मैंने टायलर के जवाब के लिए एक समान टिप्पणी की। मैं उस के लिए एक समाधान के रूप में अपने समाधान के साथ आया था।
बमर

आप सही हैं, मेरी जल्दबाजी में जब मैंने अपने बैश प्रॉम्प्ट में एक ही लाइन में इसे लिखा था for i in... और history -d $iमैंने अपनी टिप्पणी में वर्णित परिणामों को प्राप्त किया। $ 1 का उपयोग करना बिल्कुल सही है जैसा कि आपके मूल उत्तर में बताया गया है।
मत्ती

18

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

मान लें कि रेखाएँ 1800 से 1815 तक टर्मिनल में निम्नलिखित लिखती हैं:

$ for line in $(seq 1800 1815) ; do history -d 1800; done

यदि आप डिलीट कमांड के लिए हिस्ट्री हटाना चाहते हैं, तो 1815 = 1816 के लिए +1 जोड़ें और उस सीक्वेंस के लिए हिस्ट्री + डिलीट कमांड डिलीट हो जाएगी।

उदाहरण के लिए :

$ for line in $(seq 1800 1816) ; do history -d 1800; done

मैंने एक अद्यतन किया, लेकिन अभी भी उबंटू 12.04 में सही ढंग से काम नहीं कर रहा है .. :( ऐसा लग रहा है कि लाइन संख्या भाग सही तरीके से काम नहीं कर रहा है
बिनोद कलाथिल

मैंने बिनोद के सुझाए गए संपादन को अस्वीकार कर दिया क्योंकि यह तार्किक त्रुटि नहीं है। घासन का मूल कोड बरमार के उत्तर के समान दृष्टिकोण का उपयोग करता है - जो काम करता है। बामार के जवाब की टिप्पणियां बताती हैं कि 1800 $lineको हर दूसरी पंक्ति से हटाने का सुझाव क्यों वांछित सीमा से अधिक है।
एंथनी गोगेगन

18

बैश 5 के साथ अब आप एक सीमा कर सकते हैं ... हुर्रे! "

history -d 511-520

या पीछे की ओर गिनती 10:

history -d -10--1

बैश 5 मैन पेज का अंश :

'इतिहास'

विकल्प, अगर आपूर्ति की जाती है, तो निम्न अर्थ हैं:

'-d OFFSET' OFFSET की स्थिति में इतिहास प्रविष्टि हटाएं। यदि OFFSET सकारात्मक है, तो इसे निर्दिष्ट किया जाना चाहिए क्योंकि यह तब प्रदर्शित होता है जब इतिहास प्रदर्शित होता है। यदि OFFSET नकारात्मक है, तो इसे अंतिम इतिहास की स्थिति से अधिक के सापेक्ष समझा जाता है, इसलिए नकारात्मक सूचकांक इतिहास के अंत से वापस आ जाते हैं, और '-1' का एक सूचकांक वर्तमान 'इतिहास-डी' कमांड को संदर्भित करता है।

'-d START-END' समावेशी पदों के बीच की इतिहास प्रविष्टियों को हटाएं, समावेशी हैं। START और END के लिए सकारात्मक और नकारात्मक मानों की व्याख्या ऊपर बताई गई है।

यहाँ बैश 4 के लिए मेरा समाधान है। यह एक एकल प्रविष्टि या सबसे कम सूचकांक से शुरू होने वाले इतिहास की एक श्रेणी को हटाता है।

delHistory () {
    count=$(( ${2:-$1} - $1 ))
    while [[ $count -ge 0 ]]; do
        history -d "$1"
        ((count--))
    done
}

delHistory 511 520


9

संपादित करें:

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

आप शायद ऐसा कुछ कर सकते हैं:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

आप इस तरह से कहाँ जाएँगे:

./nameOfYourScript 563 514

सूचना मैंने सीमा के लिए कोई त्रुटि जाँच नहीं की है। मैं पाठक को एक अभ्यास के रूप में छोड़ दूँगा।

यह प्रश्न भी देखें


6
आपके द्वारा 510 हटाने के बाद, 511 510, 512 बन जाता है 511, और इसी तरह। तो इससे हर दूसरी लाइन हट जाएगी।
बमर

आप ब्रास विस्तार में चर शामिल नहीं कर सकते।
chepner

seq 563 514कुछ नहीं छापेंगे। आपको चाहिए seq 563 -1 514। वैकल्पिक रूप से, आप बस history -d $1तर्कों के साथ उपयोग कर सकते हैं514 563
ऐशसेन

9

शायद किसी के लिए उपयोगी होगा।
जब आप अपने वर्तमान सत्र के किसी भी कंसोल / टर्मिनल इतिहास के किसी भी उपयोगकर्ता में प्रवेश करते हैं, तो केवल कुछ "बफर" में मौजूद होता है, जो आपके लॉगआउट पर ~ / .bash_history पर फ़्लश करता है।
इसलिए, चीजों को गुप्त रखने के लिए आप बस कर सकते हैं:
history -r && exit
और आपको अपने सभी सत्रों (और केवल) इतिहास को मंजूरी दे दी जाएगी;)


5

मैंने कमांड इतिहास में ट्रेस मिटाने के लिए इस थ्रेड में साझा किए गए समाधानों के संयोजन का उपयोग किया। सबसे पहले, मैंने सत्यापित किया कि कहां सहेजे गए कमांड इतिहास हैं:

echo $HISTFILE

मैंने इसके साथ इतिहास संपादित किया:

vi <pathToFile>

उसके बाद, मैं वर्तमान सत्र इतिहास बफ़र को फ्लश करता हूं:

history -r && exit

अगली बार जब आप इस सत्र में प्रवेश करते हैं, तो अंतिम कमांड जिसे आप कमांड इतिहास पर देखेंगे, वह अंतिम है जिसे आपने pathToFile पर छोड़ा था


यह मेरे लिए काम करता है, @jgc के उत्तर के लिए, जब मैं सर्वर पर फिर से लॉगिन करता हूं, तो इतिहास फिर से वापस आ जाता है, सत्र में लॉग इन के लिए ही काम करता है
योगेश्वर तंवर

1

इतिहास -सी सभी इतिहासों को स्पष्ट करेगा।


1

अंतिम 10 प्रविष्टियों को हटाने के लिए (आपके उदाहरण के आधार पर):

history -d 511 520

1
GNU बैश में, संस्करण 4.3.11 (1) यह केवल सूची में पहली पंक्ति को हटाता है
गैरी

1

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

pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done

यह $HISTCMDइतिहास सूचकांक प्राप्त करने के लिए पर्यावरण संस्करण का उपयोग करता है और पिछले 10 प्रविष्टियों को हटाने के लिए इसका उपयोग करता है history


1

निम्नलिखित आज़माएँ:

for i in {511..520}; do history -d $i; echo "history -d $i"; done

यह मान लिया गया है कि वह पहले ही इतिहास को सूचीबद्ध कर चुका है और सभी आईडी पहले से जानता है
मार्कॉर्न

और यह इतिहास की सूची में सबसे अंतिम नहीं हो सकता है, अन्यथा: "इतिहास की स्थिति सीमा से बाहर"
devwebcl

यह होना चाहिए:for i in {511..520}; do history -d $i; echo "history -d 511"; done
devwebcl

1

मैं इसका उपयोग करता हूं (मेरे पास 4 बैश है):

histrm() {
    local num=${1:- 1}
    builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
    (( num-- )) && $FUNCNAME $num
    builtin history -w
}

builtin historyभागों में भी पिछले के रूप में -w, क्योंकि मैं जगह में प्रसिद्ध का एक परिवर्तन किया है टर्मिनलों भर में शेयर इतिहास के लिए चाल और इस समारोह उन भागों के बिना टूट जाएगा। वे वास्तविक बैश historyबिलिन के लिए एक कॉल सुनिश्चित करते हैं (और इसके आसपास मेरे खुद के आवरण के लिए नहीं), और प्रविष्टियों को हटाए जाने के ठीक बाद हिस्टीरिया को इतिहास लिखने के लिए।

हालांकि यह काम करेगा क्योंकि यह "सामान्य" इतिहास कॉन्फ़िगरेशन के साथ है।

आपको इसे अंतिम प्रविष्टियों की संख्या के साथ कॉल करना चाहिए जिन्हें आप हटाना चाहते हैं, उदाहरण के लिए:

histrm 10

अंतिम 10 प्रविष्टियों को हटा देगा।


1
history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;

जानवर लेकिन कार्यात्मक


0
for h in $(seq $(history | tail -1 | awk '{print $1-N}')  $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')

अगर आप 10 लाइनें हटाना चाहते हैं तो सिर्फ N के मूल्य को 10 में बदल दें।


0

एक साधारण फ़ंक्शन संख्या से सभी को मार सकता है (हालांकि यह त्रुटियों पर बारफेक करता है)

kill_hist() {
    for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`

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