ลบบรรทัดหนึ่งออกจากไฟล์ Bash history


คำตอบ:


106

คุณต้องออกจากระบบและย้อนกลับหรือเรียกใช้history -aดังนั้นประวัติปัจจุบันมุ่งมั่นที่จะดิสก์

~/.bash_historyแล้วก็แก้ไขไฟล์


19
หากตั้งค่าตัวแปรสภาพแวดล้อม HISTFILE ไฟล์ประวัติจะไม่ ~ / .bash_history แต่จะเป็น $ {HISTFILE}
Karolos

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

2
แต่คุณจะลบบันทึกการแก้ไขไฟล์ประวัติได้อย่างไร?
chiliNUT

5
@chiliNUT: เพียงแค่เริ่มต้นคำสั่งของคุณ (เช่นvim ~/.bash_history) ด้วยช่องว่าง คำสั่งที่ขึ้นต้นด้วยช่องว่างมักจะไม่ได้รับการบันทึก (ดู$HISTCONTROL)
cYrus

ฉันไม่คิดว่าเป็นอย่างนั้นในการแจกจ่ายของฉัน แต่โดยทั่วไปแล้วมันสมเหตุสมผล
chiliNUT

148

คุณสามารถทำการลบออกจากไฟล์ประวัติโดยใช้ commandline ในสองขั้นตอน:

  1. การพิมพ์history -d <line_number>จะลบบรรทัดที่ระบุจากประวัติในหน่วยความจำ
  2. การพิมพ์จะhistory -wเขียนประวัติในหน่วยความจำปัจจุบันลงใน~/.bash_historyไฟล์

สองขั้นตอนพร้อมกันลบบรรทัดออกจากประวัติในหน่วยความจำอย่างถาวรและจากไฟล์. bash_historyด้วย


6
วิธีการลบล่าสุดhistory -wจากประวัติ
KrIsHnA

@KrIsHnA แก้ไข ~ / .bash_history ด้วยตนเอง
Alexander Myshov

5
หรือเพิ่มช่องว่างก่อนเพื่อป้องกันไม่ให้ถูกเพิ่มดังเช่นในคำตอบของ @ tao
Mark

เพื่อค้นหา<line_number>เพียงhistory | grep [unwanted_content]เพื่อรับรายการที่มีทุกบรรทัดที่มี[unwanted_content](เช่นรหัสผ่าน)
AvL

คุณจะลบหลายบรรทัด (เฉพาะ) ได้อย่างไร (โดย id)?
Pathros

38

เพื่อป้องกันไม่ให้คำสั่งถูกเพิ่มลงในประวัติในสถานที่แรกตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อมHISTCONTROLมีค่าที่คั่นด้วยลำไส้ใหญ่ของค่าignorespaceตัวอย่างเช่น (เพิ่มเช่นไป.bashrc):

$ export HISTCONTROL=ignorespace

สิ่งนี้จะป้องกันคำสั่งใด ๆ ที่มีช่องว่างนำจากการเพิ่มลงในประวัติ จากนั้นคุณสามารถล้างประวัติทั้งหมดโดยการเรียกใช้

$  history -c -w
  ^-- additional space character

32

ก่อนอื่นถ้าคำสั่งที่คุณกำลังจะออกมีความละเอียดอ่อนไม่ปลอดภัยหรือคุณไม่ต้องการให้มันทำให้ประวัติของคุณยุ่งเหยิงมันเป็นการดีที่สุด / เร็วที่สุดที่จะป้องกันไม่ให้มันเข้ามาในตอนแรก ตรวจสอบให้แน่ใจว่า$HISTCONTROLมีignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

จากนั้นดำเนินการคำสั่งใด ๆ ที่คุณไม่ต้องการในช่องว่างด้วยประวัติ:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

หากคุณใส่คำสั่งที่ไม่ต้องการลงในประวัติโดยไม่ได้ตั้งใจหากว่าเซสชัน bash ของคุณยังคงเปิดอยู่คำสั่งนั้นยังไม่ได้แตะดิสก์ หากต้องการลบคำสั่งก่อนหน้าในประวัติปัญหา:

(bash)$  history -d $((HISTCMD-1))

สังเกตพื้นที่ชั้นนำ คำสั่งนี้ต้องการignorespaceมิฉะนั้นจะลบออกเอง!

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

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

ในกรณีนี้ 602 และ 599 จากนั้นออก:

(bash)$  for i in {602..599}; do history -d $i; done

(ไม่ignorespaceรวมจะเป็น 603..599)

หากคุณไม่ต้องการให้ประวัติใด ๆจากเซสชันปัจจุบันของคุณกดดิสก์ให้ออกโดยใช้:

(bash)$ kill -9 $$

วิธีการคือไม่ให้แม้แต่การเขียนรายการประวัติที่ละเอียดอ่อนลงบนดิสก์เพื่อความปลอดภัยเป็นพิเศษเพราะในทางทฤษฎีข้อมูลที่ถูกลบจากสื่อที่ไม่ลบเลือนยังสามารถกู้คืนได้

อย่างไรก็ตามหากคำสั่งที่คุณต้องการลบนั้นมาจากเซสชันก่อนหน้าพวกเขาจะถูกผนวกเข้า$HISTFILEกับทางออกเมื่อ การจัดการกับประวัติศาสตร์ที่มีคำสั่งดังกล่าวจะยังคงเป็นเพียงผนวกที่เหลือใหม่รายการใน$HISTFILE, เมื่อออกจาก การเขียนทับ$HISTFILEมีมุมมองในการใช้งานปัจจุบันของทั้งประวัติศาสตร์ในขณะนี้ปัญหา:

(bash)$  history -w

แน่นอนว่าไอเท็มประวัติบนดิสก์อยู่แล้วทางเลือกในการแก้ไขประวัติด้วยhistory -dคำสั่งจากนั้นก็history -wคือการแก้ไข$HISTFILEด้วยตัวแก้ไขข้อความ


1
” การจัดการประวัติด้วยคำสั่งด้านบนจะยังคงต่อท้ายรายการใหม่ที่เหลือไปยัง$HISTFILE, เมื่อออก ” ที่จริงแล้วสิ่งนี้ไม่เป็นความจริงอย่างแน่นอน ดูเหมือนว่าจะผนวกเฉพาะรายการใหม่ที่เหลืออยู่ซึ่ง 'ดึงออก' จากความยาวประวัติดั้งเดิม เช่นหากฉันลบ 5 รายการต้นฉบับและเพิ่ม 15 รายการใหม่จะมีการเพิ่มเฉพาะรายการ 10 รายการล่าสุดเท่านั้นในขณะที่ฉันคาดว่าจะมีการเพิ่มรายการใหม่ 15 รายการทั้งหมด ฉันคิดว่านี่เป็นข้อผิดพลาดเพราะฉันไม่เห็นว่านี่เป็นหน้าที่การทำงานที่พึงประสงค์หรือไม่
James Haigh

1
ฉันเดาว่าทุบตีบันทึกความยาวดั้งเดิม เมื่อปิดเซสชั่นมันจะผนวกรายการที่มีจำนวนมากกว่าค่านี้ หากค่านี้ลดลงทุกครั้งที่รายการถูกลบซึ่งมีจำนวนน้อยกว่าหรือเท่ากับค่านี้มันจะทำงานได้ตามที่คาดไว้ ;-)
James Haigh

14

เทคนิคหลายประการ:

ป้องกันข้อมูลที่สำคัญไม่ให้ถูกเก็บไว้ในไฟล์ประวัติ

หากคุณป้อนรหัสผ่านบางส่วนในบรรทัดคำสั่งจากนั้นให้ตระหนักว่าคำสั่งทั้งหมดถูกบันทึกคุณสามารถ:

  1. บังคับให้ออกจากเซสชันปัจจุบันโดยไม่บันทึกประวัติ:

     kill -9 $$

    นี่จะเป็นการทิ้งประวัติปัจจุบันทั้งหมด

  2. ประเภท↑ (up arrow)ในเซสชั่นทุบตีเปิดให้บริการจนถึงข้อมูลที่สำคัญก็แสดงให้เห็นแล้วใช้การกดปุ่มแก้ไขบรรทัดเช่นCtrl+ Wลบข้อมูลที่สำคัญและจากนั้น ↓ (down arrow)จนกว่าจะมีบรรทัดว่างใหม่จะได้รับแจ้งให้ก่อนที่จะEnterพิมพ์

ลบข้อมูลที่ละเอียดอ่อนออกจากไฟล์ประวัติ

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

sedคำสั่งง่ายๆสามารถทำงานได้:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

แต่ในขณะที่คุณพิมพ์สิ่งนี้คุณจะสร้างบรรทัดประวัติที่มีรูปแบบการค้นหา (ข้อมูลที่ละเอียดอ่อน) ที่คุณกำลังพยายามลบ ดังนั้นคุณสามารถ:

sed -e "/$(head -n1)/d" -i .bash_history

สิ่งนี้จะทำงานhead -n1ด้วยอินพุตจากเทอร์มินัล จะปรากฏว่าเทอร์มินัลของคุณหยุดทำงาน (จะไม่มีพรอมต์) เพียงพิมพ์ข้อมูลที่คุณต้องการลบออกจากไฟล์ นี่เป็นเคล็ดลับที่จะให้คุณป้อน (ส่วนหนึ่งของ) คำสั่งโดยไม่ต้องพิมพ์ลงในบรรทัดคำสั่งดังนั้นจึงไม่มีสิทธิ์สำหรับการรวมไว้ในบันทึกประวัติ จากนั้นsedจะใช้ข้อความที่คุณพิมพ์เพื่อค้นหา.bash_history และลบบรรทัดทั้งหมดที่มีข้อมูลที่ละเอียดอ่อน หมายเหตุ: หากรูปแบบข้อมูลที่ละเอียดอ่อนของคุณมีเครื่องหมายทับ (es) คุณจะต้องหลีกเลี่ยงโดยใช้เครื่องหมายแบ็กสแลชหรือเปลี่ยนsedคำสั่งเพื่อใช้ไวยากรณ์นี้เพื่อระบุตัวคั่นที่ไม่ปรากฏในรูปแบบ:

sed -e "\|$(head -n1)|d" -i .bash_history

อีกวิธีหนึ่งคือการลบเฉพาะข้อมูลที่ละเอียดอ่อน แต่เก็บคำสั่งที่มีข้อมูล สำหรับสิ่งนี้คุณสามารถแทนที่ข้อมูลที่ละเอียดอ่อนด้วยข้อความแทนที่ที่คุณเลือก:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

ลบข้อมูลที่ละเอียดอ่อนจากไฟล์ใด ๆ ในแผนผังที่เฉพาะเจาะจง

ท้ายที่สุดเพื่อให้แน่ใจว่าสิ่งนี้จะไม่อยู่ในไฟล์ที่ถูกลืมอื่น :

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

จะแสดงรายการไฟล์ที่เกี่ยวข้องทั้งหมด

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

จะแทนที่การเกิดขึ้นของข้อมูลที่ละเอียดอ่อนทั้งหมดในไฟล์ทั้งหมดในไดเรกทอรีทรีที่.รูทที่ หมายเหตุ: แม้ว่าคำสั่งนี้จะใช้xargs -0แต่ก็จะไม่จัดการกับไฟล์ด้วยการขึ้นบรรทัดใหม่ในชื่อของพวกเขา


11

ค้นหาบรรทัดที่คุณต้องการลบโดยการกด↑ (up arrow)จนกว่าจะปรากฏขึ้นแล้วกด+Ctrl Uที่ควรลบบรรทัด

หากคุณใช้historyคำสั่งคุณจะเห็นว่าบรรทัดนั้นถูกแทนที่ด้วยเครื่องหมายดอกจัน


2
ที่จริงแล้วฉันเชื่อว่าคุณต้องเลื่อนเคอร์เซอร์ขึ้นไปที่บรรทัดกด Ctrl + U แล้วเลื่อนเคอร์เซอร์ขึ้นหรือลงไปที่บรรทัดอื่น (อาจเป็นช่องว่างที่ด้านล่างของรายการ) ยิ่งไปกว่านั้นการพูดอย่างเคร่งครัดบรรทัดนั้นไม่ได้ถูกแทนที่ด้วยเครื่องหมายดอกจัน แต่คำสั่งที่ได้รับการลบและจำนวนประวัติศาสตร์*ได้รับการผนวกเข้ากับ
G-Man

1
สิ่งนี้จะมีประสิทธิภาพมากขึ้นด้วย Ctrl + R (ค้นหาประวัติส่วนเพิ่มย้อนกลับ) จากนั้นเช่น [End], Ctrl + U
sehe

4

หากคุณต้องการลบหลายบรรทัดในเวลาเดียวกันโดยปกติฉันจะใช้สิ่งนี้:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

หากคุณต้องการลบคำสั่งสุดท้ายคุณสามารถใช้:

history -d $((HISTCMD-2))

1
ดูเหมือนว่าจะใช้งานได้ แต่history | grep <string>ยังคงแสดงบรรทัดทั้งหมดที่อ้างว่าลบ ...
Brock Hensley

นี่จะลบบรรทัดประวัติที่ไม่ถูกต้องหลังจากลบ fisrt !!
mivk

1
แต่โชคดีที่มันพิมพ์เฉพาะคำสั่งลบที่ไม่ถูกต้อง ต่อไปนี้จะพิมพ์คำสั่งลบที่ถูกต้อง:history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
mivk

3

หากคุณต้องการลบช่วงของเส้นออกจากประวัติฟังก์ชั่นทุบตีต่อไปนี้สามารถประหยัดเวลาได้:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

$HOME/.bashrcฟังก์ชั่นควรจะเพิ่มโดยทั่วไป ในการใช้ฟังก์ชัน imediatelly คุณจะต้องอ่านไฟล์อีกครั้งโดยเชลล์ที่ทำงานอยู่ของคุณ ( . $HOME/.bashrc) จากนั้นให้ลบคำสั่งเช่นจากประวัติ 200-210:

$ histdel 200 210

(หมายเหตุ: คำถามนี้เป็นหนึ่งในผลการค้นหาอันดับต้น ๆ หากคุณค้นหาการลบคำสั่งต่าง ๆ จากประวัติทุบตีดังนั้นในขณะที่คำถามข้างต้นเป็นมากกว่าคำถามที่ถามไปมันอาจเป็นประโยชน์สำหรับผู้อ่านบางคน)


3
รูปแบบทางเลือกสำหรับforคำสั่ง: for n in $(seq "$2" "$1")เป็นที่ต้องการมีสไตล์โดยบางส่วนและถ้าไม่ทำงานลองseq for ((n="$2"; n>="$1"; n--))
สกอตต์

3
history | sed -i 59d

59 คือหมายเลขบรรทัด ไม่สามารถเป็นอะไรที่หวานกว่านี้ :)


3

แค่ลองสิ่งเหล่านี้

$ history

สิ่งนี้จะแสดง id ของประวัติและคำสั่งเช่น

.
.
211 LS
212 javac Welcome.java
213
จาวาต้อนรับ
.

ใช้,

$ history -d 211

ที่นี่ 211 เป็นรหัสของประวัติศาสตร์ ตอนนี้ตรวจสอบโดยใช้

$ history

.
.
211 javac Welcome.java
212
จาวาต้อนรับ
.


2

ฉันรู้ว่าเป็นเวลานานแล้วที่คำถามนี้ถูกถามและตอบคำถาม แต่ฉันจะแสดงวิธีการล้างไฟล์ประวัติและออกจากระบบในเวลาเดียวกัน

ฉันวิ่ง : history -w && nano "${HISTFILE}" && history -c && exit

มันง่ายอะไร:

  1. history -w : เขียนประวัติแคชภายใน "${HISTFILE}"
  2. nano "${HISTFILE}": อนุญาตให้ฉันแก้ไข"${HISTFILE}"คุณสามารถใช้สคริปต์หรือสิ่งที่คุณต้องการในการทำความสะอาดของคุณ"${HISTFILE}"
  3. history -c : ล้างประวัติแคชดังนั้นคำสั่งสุดท้ายนี้จะไม่ถูกต่อท้าย
  4. exit : ออกจากระบบต่อท้ายประวัติแคช ... แต่ว่างเปล่า)

หลังจากคำสั่งนั้นคุณจะถูกล็อกเอาต์ด้วยไฟล์ clean history เข้าสู่ระบบเพื่อตรวจสอบประวัติของคุณ;)

ฉันหวังว่านี่จะช่วยใครซักคน


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