ฉันจะลบบรรทัดหนึ่งออกจากhistory
ฐานข้อมูลของได้อย่างไร
ฉันจะลบบรรทัดหนึ่งออกจากhistory
ฐานข้อมูลของได้อย่างไร
คำตอบ:
คุณต้องออกจากระบบและย้อนกลับหรือเรียกใช้history -a
ดังนั้นประวัติปัจจุบันมุ่งมั่นที่จะดิสก์
~/.bash_history
แล้วก็แก้ไขไฟล์
vim ~/.bash_history
) ด้วยช่องว่าง คำสั่งที่ขึ้นต้นด้วยช่องว่างมักจะไม่ได้รับการบันทึก (ดู$HISTCONTROL
)
คุณสามารถทำการลบออกจากไฟล์ประวัติโดยใช้ commandline ในสองขั้นตอน:
history -d <line_number>
จะลบบรรทัดที่ระบุจากประวัติในหน่วยความจำhistory -w
เขียนประวัติในหน่วยความจำปัจจุบันลงใน~/.bash_history
ไฟล์สองขั้นตอนพร้อมกันลบบรรทัดออกจากประวัติในหน่วยความจำอย่างถาวรและจากไฟล์. bash_historyด้วย
history -w
จากประวัติ
<line_number>
เพียงhistory | grep [unwanted_content]
เพื่อรับรายการที่มีทุกบรรทัดที่มี[unwanted_content]
(เช่นรหัสผ่าน)
เพื่อป้องกันไม่ให้คำสั่งถูกเพิ่มลงในประวัติในสถานที่แรกตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อมHISTCONTROL
มีค่าที่คั่นด้วยลำไส้ใหญ่ของค่าignorespace
ตัวอย่างเช่น (เพิ่มเช่นไป.bashrc
):
$ export HISTCONTROL=ignorespace
สิ่งนี้จะป้องกันคำสั่งใด ๆ ที่มีช่องว่างนำจากการเพิ่มลงในประวัติ จากนั้นคุณสามารถล้างประวัติทั้งหมดโดยการเรียกใช้
$ history -c -w
^-- additional space character
ก่อนอื่นถ้าคำสั่งที่คุณกำลังจะออกมีความละเอียดอ่อนไม่ปลอดภัยหรือคุณไม่ต้องการให้มันทำให้ประวัติของคุณยุ่งเหยิงมันเป็นการดีที่สุด / เร็วที่สุดที่จะป้องกันไม่ให้มันเข้ามาในตอนแรก ตรวจสอบให้แน่ใจว่า$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
ด้วยตัวแก้ไขข้อความ
$HISTFILE
, เมื่อออก ” ที่จริงแล้วสิ่งนี้ไม่เป็นความจริงอย่างแน่นอน ดูเหมือนว่าจะผนวกเฉพาะรายการใหม่ที่เหลืออยู่ซึ่ง 'ดึงออก' จากความยาวประวัติดั้งเดิม เช่นหากฉันลบ 5 รายการต้นฉบับและเพิ่ม 15 รายการใหม่จะมีการเพิ่มเฉพาะรายการ 10 รายการล่าสุดเท่านั้นในขณะที่ฉันคาดว่าจะมีการเพิ่มรายการใหม่ 15 รายการทั้งหมด ฉันคิดว่านี่เป็นข้อผิดพลาดเพราะฉันไม่เห็นว่านี่เป็นหน้าที่การทำงานที่พึงประสงค์หรือไม่
เทคนิคหลายประการ:
หากคุณป้อนรหัสผ่านบางส่วนในบรรทัดคำสั่งจากนั้นให้ตระหนักว่าคำสั่งทั้งหมดถูกบันทึกคุณสามารถ:
บังคับให้ออกจากเซสชันปัจจุบันโดยไม่บันทึกประวัติ:
kill -9 $$
นี่จะเป็นการทิ้งประวัติปัจจุบันทั้งหมด
ประเภท↑ (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
แต่ก็จะไม่จัดการกับไฟล์ด้วยการขึ้นบรรทัดใหม่ในชื่อของพวกเขา
ค้นหาบรรทัดที่คุณต้องการลบโดยการกด↑ (up arrow)จนกว่าจะปรากฏขึ้นแล้วกด+Ctrl Uที่ควรลบบรรทัด
หากคุณใช้history
คำสั่งคุณจะเห็นว่าบรรทัดนั้นถูกแทนที่ด้วยเครื่องหมายดอกจัน
*
ได้รับการผนวกเข้ากับ
หากคุณต้องการลบหลายบรรทัดในเวลาเดียวกันโดยปกติฉันจะใช้สิ่งนี้:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
หากคุณต้องการลบคำสั่งสุดท้ายคุณสามารถใช้:
history -d $((HISTCMD-2))
history | grep <string>
ยังคงแสดงบรรทัดทั้งหมดที่อ้างว่าลบ ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
หากคุณต้องการลบช่วงของเส้นออกจากประวัติฟังก์ชั่นทุบตีต่อไปนี้สามารถประหยัดเวลาได้:
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
(หมายเหตุ: คำถามนี้เป็นหนึ่งในผลการค้นหาอันดับต้น ๆ หากคุณค้นหาการลบคำสั่งต่าง ๆ จากประวัติทุบตีดังนั้นในขณะที่คำถามข้างต้นเป็นมากกว่าคำถามที่ถามไปมันอาจเป็นประโยชน์สำหรับผู้อ่านบางคน)
for
คำสั่ง: for n in $(seq "$2" "$1")
เป็นที่ต้องการมีสไตล์โดยบางส่วนและถ้าไม่ทำงานลองseq
for ((n="$2"; n>="$1"; n--))
history | sed -i 59d
59 คือหมายเลขบรรทัด ไม่สามารถเป็นอะไรที่หวานกว่านี้ :)
แค่ลองสิ่งเหล่านี้
$ history
สิ่งนี้จะแสดง id ของประวัติและคำสั่งเช่น
.
.
211 LS
212 javac Welcome.java
213
จาวาต้อนรับ
.
ใช้,
$ history -d 211
ที่นี่ 211 เป็นรหัสของประวัติศาสตร์ ตอนนี้ตรวจสอบโดยใช้
$ history
.
.
211 javac Welcome.java
212
จาวาต้อนรับ
.
ฉันรู้ว่าเป็นเวลานานแล้วที่คำถามนี้ถูกถามและตอบคำถาม แต่ฉันจะแสดงวิธีการล้างไฟล์ประวัติและออกจากระบบในเวลาเดียวกัน
ฉันวิ่ง :
history -w && nano "${HISTFILE}" && history -c && exit
มันง่ายอะไร:
history -w
: เขียนประวัติแคชภายใน "${HISTFILE}"
nano "${HISTFILE}"
: อนุญาตให้ฉันแก้ไข"${HISTFILE}"
คุณสามารถใช้สคริปต์หรือสิ่งที่คุณต้องการในการทำความสะอาดของคุณ"${HISTFILE}"
history -c
: ล้างประวัติแคชดังนั้นคำสั่งสุดท้ายนี้จะไม่ถูกต่อท้ายexit
: ออกจากระบบต่อท้ายประวัติแคช ... แต่ว่างเปล่า)หลังจากคำสั่งนั้นคุณจะถูกล็อกเอาต์ด้วยไฟล์ clean history เข้าสู่ระบบเพื่อตรวจสอบประวัติของคุณ;)
ฉันหวังว่านี่จะช่วยใครซักคน
คุณสามารถแก้ไขไฟล์ประวัติโดยตรงเช่นnano .bash_history
ถ้าคุณอยู่ใน bash shell?