ทุบตีประวัติโดยไม่มีหมายเลขบรรทัด


130

historyคำสั่งทุบตีนั้นเจ๋งมาก ฉันเข้าใจว่าเหตุใดจึงแสดงหมายเลขบรรทัด แต่มีวิธีเรียกใช้คำสั่ง history และระงับหมายเลขบรรทัดหรือไม่

ประเด็นคือการใช้คำสั่ง history ดังนั้นโปรดอย่าตอบกลับ cat ~/.bash_history

เอาท์พุทปัจจุบัน:

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

แหล่งที่มาของกราฟิกในอดีต

ผลลัพธ์ที่ต้องการ:

man history
ls
ll
clear
cd ~
history

แหล่งที่มาของกราฟิกในอดีต

ขอบคุณทุกคนสำหรับวิธีแก้ปัญหาที่ยอดเยี่ยมของคุณ Paul เป็นวิธีที่ง่ายที่สุดและจะเหมาะกับฉันเพราะขนาดประวัติทุบตีของฉันตั้งไว้ที่ 2000

ฉันยังอยากแบ่งปันบทความดีๆที่ฉันพบเมื่อเช้านี้ มีตัวเลือกที่ดีสองสามตัวที่ตอนนี้ฉันใช้อยู่เช่นเก็บรายการที่ซ้ำกันออกจากประวัติทุบตีและตรวจสอบให้แน่ใจว่าเซสชันทุบตีหลายครั้งไม่ได้เขียนทับไฟล์ประวัติ: http://blog.macromates.com/2008/working-with -history ในทุบตี /


ฉันขอถามว่าทำไมถึงcat ~/.bash_historyถูกตัดออก?
flow2k

คำตอบ:


205

ลองสิ่งนี้:

$ history | cut -c 8-

เราสามารถไพพ์เอาต์พุตจากhistoryคำสั่งแทนการอ่านไฟล์ได้หรือไม่?
cwd

ดูเหมือนจะได้ผล! คุณอธิบายได้ไหมว่ามันทำอะไร? จะใช้ได้หรือไม่ถ้าตัวเลข 1 - 10,000
cwd

29
man cut. เป็นการลบอักขระ 7 ตัวแรกของเอาต์พุตแต่ละบรรทัดของhistoryคำสั่ง มันควรจะมีปัญหาก็ต่อเมื่อตัวเลขเกิน 99,999 สิ่งที่ฉันไม่เคยเห็น (และฉันใช้กระสุนมาก ) แต่ถ้าคุณกังวลเกี่ยวกับสิ่งนั้น:history | sed 's/^ *[0-9]* *//'
Keith Thompson

1
ฉันคิดว่าโซลูชันของ @Paul R คือสิ่งที่ฉันต้องการ ในตอนแรกฉันไม่ทราบว่าคำสั่ง history กำลังเติมหมายเลขบรรทัดด้วยช่องว่างและตอนนี้cutไวยากรณ์มีความหมายมากขึ้น :) ขอบคุณ @Keith Thompson สำหรับโซลูชันของคุณที่จะใช้งานได้> 100k ประวัติศาสตร์
cwd

5
@cwd: หากคุณมีคำสั่ง 100,000 คำในประวัติก็ถึงเวลาถอยห่างจากแป้นพิมพ์และกลับบ้าน ถ้าคุณอยู่บ้านแล้วให้ออกไปข้างนอก 8-)} (ใช่ฉันรู้ว่าประวัติศาสตร์สามารถเก็บไว้ได้ในช่วงต่างๆ)
Keith Thompson

22

awk สามารถช่วย:

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

คำตอบนี้อาจล้มเหลวหากคุณมีประวัติอันยาวนาน


ฮ่าฮ่าขอบคุณ - substrง่ายกว่ามากฉันใช้history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'ของฉันมาแล้ว !!
geedoubleya

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
wisbucky

//, ขอเพิ่มคะแนนสำหรับความจริงที่ว่าฉันไม่รู้ด้วยซ้ำว่ามีทางเลือกอื่นให้ Bash เป็นเวลานานที่สุดจนกระทั่งมีคนนำพวกเขามาในบริบทเช่นนี้
Nathan Basanese

11

ฉันสายที่หนึ่งนี้ แต่วิธีที่สั้นกว่าจะเพิ่มต่อไปในของคุณ~/.bashrcหรือ~/.profileไฟล์:

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

จากทุบตีmanpage:

       HISTTIMEFORMAT
              หากตัวแปรนี้ถูกตั้งค่าและไม่ใช่ค่าว่างระบบจะใช้ค่าเป็นไฟล์
              สตริงรูปแบบสำหรับ strftime (3) เพื่อพิมพ์การประทับเวลาที่เกี่ยวข้อง
              ด้วยรายการประวัติแต่ละรายการที่แสดงโดยประวัติในตัว ถ้า
              ตัวแปรนี้ถูกตั้งค่าการประทับเวลาจะถูกเขียนลงในประวัติ
              เพื่อให้สามารถเก็บรักษาไว้ในเซสชันเชลล์ สิ่งนี้ใช้
              อักขระข้อคิดเห็นในประวัติศาสตร์เพื่อแยกแยะการประทับเวลาจาก
              สายประวัติศาสตร์อื่น ๆ

การใช้ความสามารถนี้สมาร์ทแฮ็คประกอบด้วยการทำให้ตัวแปร "พิมพ์" ส่งคืนแคร่ ( \r) และล้างบรรทัด (รหัส ANSI 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ไม่รองรับ\+ส่วนขยายที่ไม่ได้มาตรฐาน
Richard Hansen

4

แม้ว่าการตัดด้วย-cตัวเลือกจะใช้งานได้จริง แต่ฉันคิดว่าการส่งประวัติไปยัง awk จะเป็นทางออกที่ดีกว่า ตัวอย่างเช่น:

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

หรือ

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

ทั้งสองวิธีนี้ทำในสิ่งเดียวกัน เอาต์พุตของประวัติถูกป้อนไปยัง awk จากนั้น Awk จะเว้นว่างคอลัมน์แรกซึ่งสอดคล้องกับตัวเลขในเอาต์พุตของคำสั่ง history ที่นี่ awk สะดวกกว่าเพราะคุณไม่ต้องกังวลกับจำนวนอักขระในส่วนตัวเลขของผลลัพธ์

print $0เทียบเท่ากับprintเนื่องจากค่าเริ่มต้นคือการพิมพ์ทุกอย่างที่ปรากฏบนบรรทัด การพิมพ์print $0มีความชัดเจนมากกว่า แต่จะเลือกแบบไหนก็ขึ้นอยู่กับคุณ ลักษณะการทำงานของprint $0และอย่างง่ายprintเมื่อใช้กับ awk จะชัดเจนมากขึ้นหากคุณใช้ awk เพื่อพิมพ์ไฟล์ ( catจะพิมพ์ได้เร็วกว่าแทน awk แต่นี่เป็นการแสดงจุด)

[เช่น] การใช้ awk เพื่อแสดงเนื้อหาของไฟล์ด้วย $ 0

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

[เช่น] การใช้ awk เพื่อแสดงเนื้อหาของไฟล์โดยไม่มี $ 0 อย่างชัดเจน

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

[เช่น] การใช้ 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:

-w เขียนประวัติปัจจุบันลงในไฟล์ประวัติ

มันเขียนประวัติปัจจุบันไปยังไฟล์ที่ระบุ - /dev/stdoutในกรณีนี้


3

historyคำสั่งไม่มีตัวเลือกในการระงับหมายเลขบรรทัด คุณจะต้องรวมหลายคำสั่งตามที่ทุกคนแนะนำ:

ตัวอย่าง:

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

3
หากคุณจะเรียกใช้มันsedต่อไปการตัดครั้งแรกจะซ้ำซ้อน - เพียงแค่เพิ่มลงในนิพจน์แทน
moopet

2
$ hh -n

คุณอาจต้องการลองใช้https://github.com/dvorka/hstrซึ่งอนุญาตให้มีการกรอง "แนะนำรูปแบบกล่อง" ของประวัติ Bash ด้วยการจัดลำดับตามเมตริก (ไม่บังคับ) กล่าวคือมีประสิทธิภาพและเร็วกว่ามากทั้งในทิศทางไปข้างหน้าและข้างหลัง:

ใส่คำอธิบายภาพที่นี่

สามารถผูกมัดCtrl-rและ / หรือได้อย่างง่ายดายCtrl-s


1

คุณสามารถใช้คำสั่งcutเพื่อแก้ปัญหาได้:

ตัดฟิลด์ออกจาก STDIN หรือไฟล์

  • ตัดอักขระสิบหกตัวแรกของแต่ละบรรทัดของ STDIN: cut -c 1-16

  • ตัดอักขระสิบหกตัวแรกของแต่ละบรรทัดของไฟล์ที่กำหนด: cut -c 1-16 file

  • ตัดทุกอย่างตั้งแต่อักขระตัวที่ 3 ไปจนถึงท้ายแต่ละบรรทัด: cut -c3-

  • ตัดฟิลด์ที่ห้าของแต่ละบรรทัดออกโดยใช้โคลอนเป็นตัวคั่นฟิลด์ (ตัวคั่นเริ่มต้นคือแท็บ): cut -d':' -f5

  • ตัดฟิลด์ที่ 2 และ 10 ของแต่ละบรรทัดออกโดยใช้อัฒภาคเป็นตัวคั่น: cut -d';' -f2,10

  • ตัดฟิลด์ 3 ถึง 7 ของแต่ละบรรทัดโดยใช้ช่องว่างเป็นตัวคั่น: cut -d' ' -f3-7


0

ฉันรู้ว่าฉันมาสายปาร์ตี้ แต่มันง่ายกว่ามากที่จะจำ:

cat ~/.bash_history

จริง แต่บรรทัดที่สองของ OP: "ประเด็นนี้คือการใช้คำสั่ง history ดังนั้นโปรดอย่าตอบกลับ cat ~ /
.bash_history
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.