लाइन नंबर के बिना इतिहास को कोसो


129

बैश historyकमांड बहुत अच्छा है। मैं समझता हूं कि यह लाइन नंबर क्यों दिखाता है, लेकिन क्या कोई तरीका है जो मैं इतिहास कमांड को लागू कर सकता हूं और लाइन नंबर दबा सकता हूं?

यहाँ मुद्दा इतिहास कमांड का उपयोग करने का है, इसलिए कृपया उत्तर न दें cat ~/.bash_history

मौजूदा उत्पादन:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

ऐतिहासिक ग्राफिक स्रोत।

वांछित आउटपुट:

man history
ls
ll
clear
cd ~
history

ऐतिहासिक ग्राफिक स्रोत।

आपके महान समाधानों के लिए सभी को धन्यवाद। पॉल सबसे सरल है और मेरे लिए काम करेगा क्योंकि मेरे बैश इतिहास का आकार 2000 में निर्धारित है।

मैं आज सुबह मिले एक शांत लेख को भी साझा करना चाहता था। इसके कुछ अच्छे विकल्प हैं जिनका मैं अब उपयोग कर रहा हूं, जैसे डुप्लिकेट प्रविष्टियों को बैश इतिहास से बाहर रखना और सुनिश्चित करना कि कई बैश सत्र इतिहास फ़ाइल को अधिलेखित न करें: http://blog.macromates.com/2008/working-with -History-इन-बैश /


क्या मैं पूछ सकता हूं कि क्यों cat ~/.bash_historyखारिज किया गया है?
flow2k

जवाबों:


204

इसे इस्तेमाल करे:

$ history | cut -c 8-

क्या हम historyफाइल को पढ़ने के बजाय कमांड से आउटपुट में पाइप कर सकते हैं ?
cwd

काम करने लगता है! क्या आप बता सकते हैं कि यह क्या कर रहा है? क्या यह काम करेगा यदि संख्या 1 - 10,000 हो?
cwd

29
man cut। यह historyकमांड के आउटपुट की प्रत्येक पंक्ति के पहले 7 अक्षरों को हटा रहा है । यह केवल समस्याएँ होनी चाहिए यदि संख्या 99,999 से अधिक हो, तो कुछ ऐसा जो मैंने कभी नहीं देखा (और मैं बहुत सारे गोले का उपयोग करता हूं )। लेकिन अगर आप इसके बारे में चिंतित हैं:history | sed 's/^ *[0-9]* *//'
कीथ थॉम्पसन

1
मुझे लगता है कि @Paul R का समाधान है जो मुझे चाहिए। मुझे पहले यह महसूस नहीं हुआ कि इतिहास कमांड रिक्त स्थान के साथ पंक्ति संख्या को पैडिंग कर रहा था और अब cutवाक्यविन्यास अधिक समझ में आता है :) धन्यवाद @Keith थॉम्पसन आपके समाधान के लिए> 100k इतिहास के लिए काम करेगा।
cwd

5
@cwd: यदि आपके पास अपने इतिहास में 100,000 कमांड हैं, तो कीबोर्ड से दूर जाने और घर जाने का समय है। यदि आप पहले से ही घर हैं, तो बाहर जाएं। 8-)} (हाँ, मुझे पता है कि इतिहास को सत्रों में बनाए रखा जा सकता है।)
कीथ थॉम्पसन

22

awk मदद कर सकते है:

history|awk '{$1="";print substr($0,2)}'

यदि आपका इतिहास लंबा है तो यह उत्तर विफल हो सकता है।


हा हा, धन्यवाद - substrइतना सरल है, मैं history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'मेरे लिए उपयोग कर रहा हूँ !!
गीदडोल्या

17

मुझे यह पता है कि यह सवाल बकवास के लिए है और बहुत से लोग zsh (cue downvotes ...) पर स्विच नहीं करना पसंद करेंगे

हालाँकि, यदि आप zsh पर स्विच करने के लिए तैयार थे, तो zsh इसे मूल रूप से समर्थन करता है (साथ ही इतिहास प्रारूपण के अन्य विकल्प)

zsh> fc -ln 0

(देखें /server/114988/removing-history-or-line-numbers-from-zsh-history-file )


7
वास्तव fcमें एक bashबिलिन भी है। फर्क सिर्फ इतना है कि पहली पंक्ति है 1, इसलिए यह होगाfc -ln 1
बुद्धिमानी से

//, इस तथ्य के लिए एक उत्थान है कि मुझे यह भी नहीं पता था कि बैश के सबसे लंबे समय तक विकल्प थे जब तक कि कोई उन्हें इस तरह एक संदर्भ में नहीं लाता।
नाथन बसानी 20

11

मुझे इस पर देर हो रही है, लेकिन आपकी ~/.bashrcया ~/.profileफ़ाइल में निम्न विधि को जोड़ना होगा :

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

बैश से manpage:

       HISTTIMEFORMAT
              यदि यह चर सेट है और शून्य नहीं है, तो इसका मान a के रूप में उपयोग किया जाता है
              स्टैम्पटाइम के लिए प्रारूप स्ट्रिंग (3) जुड़े समय टिकट मुद्रित करने के लिए
              इतिहास में निर्मित प्रत्येक इतिहास प्रविष्टि के साथ प्रदर्शित किया जाता है। अगर
              यह चर सेट किया जाता है, समय टिकटों को इतिहास में लिखा जाता है
              फ़ाइल इसलिए वे शेल सत्रों में संरक्षित की जा सकती हैं। यह उपयोग करता है
              टाइमस्टैम्प से भेद करने के लिए इतिहास टिप्पणी चरित्र
              अन्य इतिहास पंक्तियाँ।

इस क्षमता का उपयोग करते हुए, एक स्मार्ट हैक में वैरिएबल "प्रिंट" को एक गाड़ी वापसी ( \r) बनाने और Kवास्तविक टाइमस्टैम्प के बजाय लाइन (एएनएसआई कोड ) को साफ करने में शामिल है।


एक सरल सा अधिक अस्पष्ट सिंटैक्स का उपयोग,:HISTTIMEFORMAT=$'\r\e[K'
wjandrea

5
और एक पंक्ति विकल्प:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea

5

वैकल्पिक रूप से, आप sed का उपयोग कर सकते हैं:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

उपनाम का उपयोग करके, आप इसे अपने मानक के रूप में सेट कर सकते हैं (इसे अपने bash_profile में चिपकाएँ):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"

1
\+एक बुनियादी नियमित अभिव्यक्ति में POSIX अनुरूप नहीं है। \{1,\}यदि आपका sedगैर-मानक \+एक्सटेंशन का समर्थन नहीं करता है तो उपयोग करें ।
रिचर्ड हेन्सन

4

यद्यपि -cविकल्प के साथ कटौती सबसे व्यावहारिक उद्देश्यों के लिए काम करती है, मुझे लगता है कि जागने के लिए पाइपिंग इतिहास एक बेहतर समाधान होगा। उदाहरण के लिए:

history | awk '{ $1=""; print }'

या

history | awk '{ $1=""; print $0 }'

ये दोनों उपाय एक ही काम करते हैं। इतिहास का आउटपुट जागने के लिए खिलाया जा रहा है। अक्क फिर पहले कॉलम को खाली करता है, जो इतिहास कमांड के आउटपुट में संख्याओं से मेल खाता है। यहाँ awk अधिक सुविधाजनक है क्योंकि आपको आउटपुट के संख्या भाग में वर्णों की संख्या के साथ खुद को परेशान करने की आवश्यकता नहीं है।

print $0के बराबर है print, क्योंकि डिफ़ॉल्ट लाइन पर दिखाई देने वाली सभी चीजों को प्रिंट करना है। टाइपिंग print $0अधिक स्पष्ट है, लेकिन जो आप चुनते हैं वह आपके ऊपर है। के व्यवहार print $0और बस printजब awk के साथ प्रयोग किया और अधिक स्पष्ट करता है, तो आप एक फ़ाइल मुद्रित करने के लिए awk प्रयोग किया जाता है ( catawk के बजाय टाइप करने के लिए तेजी से हो सकता है, लेकिन यह एक बिंदु illustrating के लिए है)।

[पूर्व] $ 0 के साथ फ़ाइल की सामग्री को प्रदर्शित करने के लिए awk का उपयोग करना

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[पूर्व] स्पष्ट $ 0 के बिना फ़ाइल की सामग्री को प्रदर्शित करने के लिए awk का उपयोग करना

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex] जब इतिहास लाइन कई पंक्तियों तक फैली हो तो awk का उपयोग करना

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

4
history -w /dev/stdout

के उत्पादन से history --help:

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

यह निर्दिष्ट फ़ाइल में वर्तमान इतिहास लिखता है - /dev/stdoutइस मामले में।


3

historyकमांड में लाइन नंबरों को दबाने का विकल्प नहीं है। जैसा कि हर कोई सुझाव दे रहा है, आपको कई आदेशों को संयोजित करना होगा:

उदाहरण :

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'

3
यदि आप इसे sedकिसी भी माध्यम से चलाने जा रहे हैं , तो शुरुआती कटौती बेमानी है - बस इसे अभिव्यक्ति में जोड़ें।
मोपेट

2
$ hh -n

आप https://github.com/dvorka/hstr को आज़माना चाहते हैं, जो बैश इतिहास को फ़िल्टर करने की "सुझाव बॉक्स शैली" की अनुमति देता है (वैकल्पिक) मेट्रिक्स आधारित आदेश के साथ अर्थात यह आगे और पीछे दोनों दिशाओं में बहुत अधिक कुशल और तेज़ है:

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

यह आसानी से Ctrl-rऔर / या के लिए बाध्य हो सकता हैCtrl-s


1

आप cutइसे हल करने के लिए कमांड का उपयोग कर सकते हैं :

खेतों को STDIN या फ़ाइलों से काटें।

  • STDIN की प्रत्येक पंक्ति के पहले सोलह वर्णों को काटें: cut -c 1-16

  • दी गई फ़ाइलों की प्रत्येक पंक्ति के पहले सोलह अक्षरों को काटें: cut -c 1-16 file

  • प्रत्येक पंक्ति के अंत में तीसरे वर्ण से सब कुछ काटें: cut -c3-

  • प्रत्येक लाइन के पांचवें क्षेत्र को काटें, एक क्षेत्र सीमांकक के रूप में एक बृहदान्त्र का उपयोग करके (डिफ़ॉल्ट सीमांकक टैब है): cut -d':' -f5

  • प्रत्येक लाइन के 2 और 10 वें क्षेत्रों को काटें, एक अर्धविराम को सीमांकक के रूप में उपयोग करते हुए: cut -d';' -f2,10

  • एक सीमांकक के रूप में एक स्थान का उपयोग करके, प्रत्येक पंक्ति के 7 में से 3 क्षेत्रों को काटें: cut -d' ' -f3-7


0

मुझे पता है कि मुझे पार्टी में देर हो रही है लेकिन यह याद रखना इतना आसान है:

cat ~/.bash_history

यह सच है, लेकिन ओपी की दूसरी पंक्ति: "यहाँ बिंदु इतिहास कमांड का उपयोग करना है, इसलिए कृपया बिल्ली को जवाब न दें ~ .bash_history"
Cireo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.