วิธีลบผลลัพธ์ที่เลือกออกจากประวัติทุบตี


66

historyคำสั่งจะแสดงผลทั้งหมด history | grep searchingCommandแต่เราสามารถกรองคำสั่งที่จะได้รับโดยเฉพาะอย่างยิ่งการใช้ มันมีประโยชน์จริงๆ

แต่ปัญหาคือมันแสดงคำสั่งเหล่านั้นซึ่งถูกป้อนด้วยข้อผิดพลาดการพิมพ์ผิดหรือที่ไม่ประสบความสำเร็จ จากนั้นการระบุสิ่งที่ถูกต้องนั้นเป็นความเจ็บปวดจริงๆ ฉันตรวจสอบลิงค์นี้: ประวัติคำสั่งเลือกใน terminal? แต่นั่นไม่ใช่ทางออกของฉัน

ดังนั้นมีวิธีการลบคำสั่งเหล่านั้นออกจากประวัติซึ่งไม่ถูกต้องในเวลาที่ป้อนหรือในภายหลังหรือไม่


5
กรุณาเปลี่ยนคำตอบที่ยอมรับมีคนอื่น ๆ ที่มีมากกว่า 100 คะแนนขึ้นไป
greuze

1
@greuze: เปลี่ยนเป็นคำตอบที่ดีที่สุด การนับคะแนนไม่ได้หมายความว่าดีที่สุด!
Saurav Kumar

คำตอบ:


20

ฉันต้องการเพิ่มวิธีอื่นในการแก้ไข (หรือลบ) รายการประวัติซึ่งฉันพบว่าค่อนข้างบังเอิญเมื่อฉันทำงานกับทุบตี:

เพื่อสาธิตสิ่งนี้ให้เริ่มต้นโดยการดำเนินการสามคำสั่งต่อไปนี้ใน bash:

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

ตอนนี้คุณสามารถเลือกคำสั่งเหล่านี้อีกครั้งโดยใช้ปุ่มลูกศรหรือCtrl+ pและ+Ctrln

สมมติว่าคุณต้องการแก้ไขสองคำสั่งแรก เลื่อนดูประวัติจนกระทั่งecho 1ปรากฏขึ้นและเปลี่ยนเป็นecho 1 - changedแต่อย่ากด ENTER หากตอนนี้คุณย้ายต่อไปในประวัติศาสตร์ของคุณบรรทัดนี้จะยังคงอยู่ในสถานะที่แก้ไขและคุณสามารถย้ายออกจากและกลับไปที่ ตอนนี้ย้ายไปที่บรรทัดecho 2และเปลี่ยนเป็นecho 2 - changedอย่ากด Enter อีกครั้ง เพื่อที่จะบันทึกการเปลี่ยนแปลงบรรทัดเหล่านี้เลือกคำสั่งใด ๆ ในประวัติศาสตร์ยกเว้นสำหรับทั้งสองและกด+Ctrlc

แน่นอนแทนที่จะแก้ไขรายการประวัติคุณอาจลบรายการซึ่งจะทำให้บรรทัดว่างที่รายการนั้น หากต้องการลบบรรทัดที่แสดงที่พรอมต์ในปัจจุบันให้กดCtrl+ e(ซึ่งข้ามไปยังจุดสิ้นสุดของบรรทัด) ตามด้วยCtrl+ u(ซึ่งจะลบข้อความจากจุดเริ่มต้นของบรรทัดไปยังเคอร์เซอร์)

ดูเพิ่มเติมที่https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-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
Saurav Kumar

144

ใช้:

history -d OFFSET

เพื่อลบรายการประวัติที่ออฟเซ็ตOFFSETแม้ก่อนที่จะถูกเพิ่มในไฟล์ประวัติทุบตีของคุณ หากต้องการค้นหาสิ่งที่ถูกOFFSETต้องคุณต้องเรียกใช้historyคำสั่งเท่านั้น เป็นตัวเลขตั้งแต่ต้นบรรทัดซึ่งมีรายการประวัติที่คุณต้องการลบ

และเพื่อบันทึกการแก้ไขการใช้ประวัติ:

history -w

ดูรายละเอียดเพิ่มเติมในคู่มือนี้


ไม่เลว :) ดีเพื่อให้ได้วิธีใหม่ ..
Saurav Kumar

10
@SauravKumar ไม่เลวเลยเหรอ?!? อาจเป็นวิธีที่ดีที่สุด ...
Radu Rădeanu

5
อ่านก่อน: เพื่อให้ชัดเจนคุณต้องทำhistory -wafterwords เพื่อบันทึกการเปลี่ยนแปลง OFFSET ยังหมายถึงหมายเลขที่historyแสดง ถ้าบรรทัดที่คุณกำลังพยายามที่จะลบเป็น 873 history -d 873แล้วใช้
Cammy_the_block

2
@ RaduRădeanuใช้history -wหลังจากhistory -dเพื่อบันทึกการเปลี่ยนแปลง
Cammy_the_block

20
นี่ควรเป็นคำตอบที่ถูกต้อง
topher

19

แก้ไขไฟล์~/.bash_historyและลบครั้งเดียวด้วยการพิมพ์ผิด

ตัวอย่างเช่นแทรกคำสั่งนี้:

gedit ~/.bash_history

แก้ไขสิ่งที่คุณชอบและหลังจากบันทึกไฟล์และรีสตาร์ทเทอร์มินัล คำสั่ง root คือ:

sudo -i 
inser your password
gedit ~/.bash_history

หากคุณต้องการลบทั้งหมดhistory -cควรทำเคล็ดลับ


SYNTAX

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

สำคัญ

-c ล้างรายการประวัติ นี่อาจรวมกับตัวเลือกอื่นเพื่อแทนที่รายการประวัติอย่างสมบูรณ์

-d offset ลบรายการประวัติที่ตำแหน่ง offset ควรระบุ offset ตามที่ปรากฏเมื่อมีการแสดงประวัติ

-a ต่อท้ายบรรทัดประวัติใหม่ (บรรทัดประวัติที่ป้อนตั้งแต่ต้นเซสชัน Bash ปัจจุบัน) ไปยังไฟล์ประวัติ

ต่อท้ายบรรทัดประวัติที่ไม่ได้อ่านจากไฟล์ประวัติไปยังรายการประวัติปัจจุบัน บรรทัดเหล่านี้ถูกต่อท้ายไฟล์ประวัติตั้งแต่เริ่มต้นเซสชัน Bash ปัจจุบัน

-r อ่านไฟล์ประวัติปัจจุบันและผนวกเนื้อหาลงในรายการประวัติ

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

-p ทำการทดแทนประวัติบน args และแสดงผลลัพธ์ในเอาต์พุตมาตรฐานโดยไม่เก็บผลลัพธ์ไว้ในรายการประวัติ

-s args จะถูกเพิ่มในตอนท้ายของรายการประวัติเป็นรายการเดียว

แหล่งที่มา :


ขอบคุณมันมีประโยชน์! คุณรู้วิธีการลบรายการในเวลาเมื่อป้อนจากบรรทัดคำสั่งหรือไม่ หรือมีคำสั่งให้ลบรายการโดยไม่เปิด.bash_historyหรือไม่
Saurav Kumar

1
@ bladed19899 history -cไม่ทำงานเมื่อฉันปิดเทอร์มินัลแล้วเปิดอีกครั้งประวัติจะไม่ถูกลบ -1 คำตอบของคุณ
αғsнιη

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. ซอร์ส
blade19899

2
@KasiyA ใช้history -wหลังจากhistory -cเขียนการเปลี่ยนแปลง
Cammy_the_block

16

หากคุณต้องการลบมันทันทีในรูปแบบเทอร์มินัลเดียวกันก่อนอื่นคุณต้องเพิ่มสิ่งต่อไปนี้ในไฟล์ ~ / .bashrc ของคุณ

PROMPT_COMMAND='history -a' 

และรีสตาร์ทเครื่องของคุณ

คุณสามารถเพิ่มได้ทุกที่ในไฟล์. bashrc ฉันได้เพิ่มไว้ด้านล่างพร้อมกับสิ่งอื่น ๆ ที่เกี่ยวข้องกับประวัติ

ป้อนคำอธิบายรูปภาพที่นี่

โดยปกติในระหว่างเซสชัน bash คำสั่งที่ดำเนินการจะไม่ถูกเขียนลงใน. bash_history จนกว่าเซสชันจะถูกยกเลิกดังนั้นจึงPROMPT_COMMAND='history -a'เข้าสู่คำสั่งจากนั้นจึงเข้าสู่. bash_history

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

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
     sudo cp rh / bin 
  • ตอนนี้ใช้rhคำสั่งเพื่อลบคำสั่งล่าสุดจากประวัติ


ที่ที่จะเพิ่มPROMPT_COMMAND='history -a'ใน.bashrcไฟล์? แล้วมันจะทำอะไรกันแน่? ฉันพยายามsed -i '$d' ~/.bash_historyมันทำงานโดยไม่ต้องแก้ไข.bashrc!! แต่สิ่งนามแฝงไม่ทำงาน .. ฉันจะยอมรับคำตอบของคุณถ้าคุณเพียงแค่ทำอย่างละเอียดคำถามของฉันและทำให้การทำงานนามแฝง .. :)
Saurav Kumar

@SauravKumar ได้แก้ไขคำตอบแล้ว พลาดคำพูดเดี่ยวและคู่ในคำสั่ง aliasing .. bad ของฉัน .. : P
Stormvirux

เชื่อฉันหรือไม่ .. สิ่งนามแฝงยังคงไม่ทำงาน .. มันดำเนินการโดยไม่มีข้อผิดพลาด แต่ไม่ลบรายการจาก.bash_historyไฟล์ .. : P วิธีใด ๆ .. ไม่มีปัญหา .. ฉันทำคำสั่งของตัวเองและวางไว้ใน/binไดเรกทอรี ตั้งแต่เนื่องจากคำสั่งของคุณ: sed -i "$d" ~/.bash_historyมันทำงานได้ดี ฉันยอมรับคำตอบของคุณ .. :)
Saurav Kumar

ถ้าคุณไม่รังเกียจฉันต้องการแก้ไขคำตอบของคุณเพื่อที่จะเป็นประโยชน์กับผู้อื่น ..
Saurav Kumar

จริงๆแล้วฉันแก้ไขมัน คุณต้องอนุมัติ ..
Saurav Kumar

2

เพื่อลบหลายบรรทัด (เช่นตั้งแต่ปี 1974 ถึง 1990 ตรวจสอบด้วยhistoryคำสั่ง):

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

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


หมายเหตุเป็นสิ่งสำคัญมาก
Weijun Zhou

1

หากคุณกำลังใช้ตัวเลือก "set -o vi" ใน bash (มีประโยชน์มากในการค้นหาด้วยปุ่ม Escape) จากนั้นคุณสามารถค้นหาบรรทัดและลบบรรทัดด้วย "dd" ในแบบเดียวกับที่คุณทำใน "vi"


ฉันพบว่าฉันต้องพิมพ์jหรือkหลังจากddเพื่อให้ชัดเจนคำสั่งจากประวัติศาสตร์ ถ้าฉันพิมพ์คำสั่งอื่นหรือเพียงแค่กดEnterbash ดูเหมือนจะถือว่าเป็นเพียงคำสั่งใหม่และควรเก็บคำสั่งเก่าไว้ในประวัติ นอกจากนี้ยังเป็นที่น่าสนใจที่จะทราบว่าเมื่อมันถูกต้องมันจะล้างคำสั่ง แต่ไม่ลบมัน - ผลลัพธ์คือรายการประวัติที่ว่างเปล่า แต่มันก็ดีพอสำหรับการลบรหัสผ่านที่ฉันถูกบังคับให้พิมพ์ที่บรรทัดคำสั่งและง่ายกว่าคำตอบอื่น ๆ ดังนั้นขอบคุณมากสำหรับการโพสต์สิ่งนี้!
Michael Scheper

0

ฉันมีสถานการณ์ที่ฉันมีรายการฟุ่มเฟือยในประวัติศาสตร์ทุบตีของฉันจาก Yubikey- อาจจะประมาณ 50 หรือมากกว่านั้นตรงกับ 'ccccc ..... ' เป็นการดีที่ฉันต้องการวิธีการลบรายการที่ตรงกับรูปแบบซึ่งฉันคิดว่าคุณสามารถทำกับ sed หรือบางสิ่งบางอย่างโดยสมมติว่าประวัติของคุณละเว้นช่องว่าง

อย่างไรก็ตามฉันขี้เกียจและลงเอยด้วยการใช้เสียงเรียกเข้าค้นหา 'cccc' และใช้ 'dd' ในขณะที่ขี่จักรยานผ่านการแข่งขันทุกนัด ใช้เวลาไม่เกินหนึ่งนาที


1
หากคุณกำลังทำสิ่งนี้เป็นกลุ่มคุณสามารถทำได้: g / cccc / d หรือ: g / ^ cccc / d: หรือใช้แมโคร qqnddq จากนั้น @@ (ถือว่าการค้นหาล่าสุดของคุณคือ ccccc)
htaccess

@ htaccess นั่นเป็นเรื่องง่ายกว่า แต่ฉันต้องการตรวจสอบไฟล์ที่เหลือในเวลาเดียวกัน
Dylan_Larkin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.