كيف تحذف محفوظات آخر 10 أوامر في شل؟

سئل على ٧ فبراير ٢٠١٣  ·  تمت مشاهدة 288.2k مرة  ·  مصدر

Justin John picture
في ٧ فبراير ٢٠١٣

الأوامر تتبع

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

يمكنني حذف واحد من خلال history -d 511 ، ولكن كيف أحذف آخر 10 أوامر وبين 10 أوامر محفوظات باستخدام أمر واحد في shell؟

هل يمكننا كتابة سكربت باش وتنفيذه لحذف التاريخ؟

الإجابات

WheretheresaWill picture
في ٧ فبراير ٢٠١٣
112

هل حاولت تحرير ملف المحفوظات مباشرة:

~/.bash_history
JGC picture
في ٢٥ أبريل ٢٠١٦
77

تستند إجابتي على الإجابات السابقة ، ولكن مع إضافة عكس التسلسل بحيث يتم حذف عناصر السجل من الأحدث إلى الأقل الأحدث.

احصل على سجلك الحالي (اضبط عدد الأسطر التي تريد رؤيتها):

history | tail -n 10

هذا يعطيني شيء مثل

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

حدد مواضع البداية والنهاية للعناصر التي تريد حذفها. سأقوم بحذف الإدخالات من 1006 إلى 1008.

for h in $(seq 1006 1008); do history -d 1006; done

سيؤدي هذا إلى إنشاء أوامر history -d لـ 1006 ، ثم يصبح 1007 1006 ويتم حذف 1006 ، ثم 1008 (أصبح 1007) أصبح الآن 1006 ويتم حذفه.

إذا أردت أيضًا حذف أمر حذف السجل ، فسيكون الأمر أكثر تعقيدًا بعض الشيء لأنك بحاجة إلى معرفة إدخال السجل الأقصى الحالي.

يمكنك الحصول على هذا (قد تكون هناك طريقة أفضل):

history 1 | awk '{print $1}'

بتجميعها معًا ، يمكنك استخدام هذا لحذف نطاق ، وكذلك حذف أمر حذف السجل:

for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')

اختتم كل هذا في دالة لإضافتها إلى ~/.bashrc :

histdel(){
  for h in $(seq $1 $2); do
    history -d $1
  done
  history -d $(history 1 | awk '{print $1}')
  }

مثال على حذف الأمر 4 و 5 و 6 (1049-1051) وإخفاء الدليل:

[18:21:02 [email protected] ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 [email protected] ~]$ histdel 1049 1051
[18:21:23 [email protected] ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

كان السؤال في الواقع هو حذف آخر 10 أوامر من السجل ، لذلك إذا كنت تريد توفير القليل من الجهد ، يمكنك استخدام وظيفة أخرى لاستدعاء وظيفة histdel التي تقوم بالحسابات نيابة عنك.

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

تأخذ هذه الوظيفة وسيطة واحدة ، عدد عناصر المحفوظات السابقة المطلوب حذفها. لذا لحذف آخر 10 أوامر من السجل ، ما عليك سوى استخدام histdeln 10 .

Barmar picture
في ٧ فبراير ٢٠١٣
31
for x in `seq $1 $2`
do
  history -d $1
done
Ghassan Zein picture
في ٢٦ فبراير ٢٠١٦
21

أولاً ، اكتب: history واكتب تسلسل أرقام الأسطر التي تريد إزالتها.

لمسح الأسطر من الخط 1800 إلى 1815 ، اكتب ما يلي في Terminal:

$ for line in $(seq 1800 1815) ; do history -d 1800; done

إذا كنت تريد حذف محفوظات أمر الحذف ، أضف +1 لعام 1815 = 1816 وسيتم حذف السجل لهذا التسلسل + أمر الحذف.

فمثلا :

$ for line in $(seq 1800 1816) ; do history -d 1800; done
David Hatch picture
في ١٦ يناير ٢٠١٩
20

مع Bash 5 يمكنك الآن عمل مجموعة ... الصيحة!:

history -d 511-520

أو العد التنازلي 10:

history -d -10--1

مقتطف من Bash 5 Man Page :

'التاريخ'

الخيارات ، إذا تم توفيرها ، لها المعاني التالية:

"-d OFFSET" احذف إدخال المحفوظات في موضع OFFSET. إذا كانت قيمة OFFSET موجبة ، فيجب تحديدها كما تظهر عند عرض السجل. إذا كانت قيمة OFFSET سالبة ، يتم تفسيرها على أنها نسبة إلى موضع أكبر من آخر موضع للتاريخ ، لذا فإن المؤشرات السالبة تعود من نهاية السجل ، ويشير الفهرس "-1" إلى الأمر "history -d" الحالي.

"-d START-END" احذف إدخالات السجل بين المواضع START و END ، ضمناً. يتم تفسير القيم الموجبة والسالبة لـ START و END كما هو موضح أعلاه.

هذا هو الحل الخاص بي لـ Bash 4. إنه يقوم بشكل متكرر بحذف إدخال واحد أو نطاق من المحفوظات يبدأ بأدنى مؤشر.

delHistory () {
    count=$(( ${2:-$1} - $1 ))
    while [[ $count -ge 0 ]]; do
        history -d "$1"
        ((count--))
    done
}

delHistory 511 520
Bryant Bernstein picture
في ٢١ سبتمبر ٢٠١٧
16

الجمع بين الإجابات الواردة أعلاه:

history -w vi ~/.bash_history history -r

Tyler Jandreau picture
في ٧ فبراير ٢٠١٣
9

تعديل:

تم تغيير التكرارات المقواة ، مكالمة جيدة. أيضا ، استدعاء هذه الوظيفة مع مكرر عكسي.

ربما يمكنك فعل شيء مثل هذا:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

حيث سوف تستحضر مثل هذا:

./nameOfYourScript 563 514

لاحظ أنني لم أضع أي خطأ في التحقق من الحدود. سأترك ذلك كتمرين للقارئ.

انظر أيضا هذا السؤال

Alex picture
في ٢٧ أكتوبر ٢٠١٧
9

ربما ستكون مفيدة لشخص ما.
عندما تقوم بتسجيل الدخول إلى أي مستخدم لأي وحدة تحكم / سجل طرفي لجلستك الحالية ، يوجد فقط في بعض "المخزن المؤقت" الذي يتدفق إلى ~ / .bash_history عند تسجيل الخروج.
لذلك ، للحفاظ على سرية الأشياء ، يمكنك فقط:
history -r && exit
وسيتم تسجيل خروجك مع مسح جميع محفوظات جلستك (فقط) ؛)

M. Gleria picture
في ٢١ ديسمبر ٢٠١٨
5

لقد استخدمت مجموعة من الحلول المشتركة في هذا الموضوع لمسح التتبع في سجل الأوامر. أولاً ، لقد تحققت من مكان حفظ سجل الأوامر باستخدام:

echo $HISTFILE

لقد قمت بتحرير السجل باستخدام:

vi <pathToFile>

بعد ذلك ، أقوم بمسح المخزن المؤقت لمحفوظات الجلسة الحالية باستخدام:

history -r && exit

في المرة التالية التي تدخل فيها إلى هذه الجلسة ، يكون آخر أمر ستراه في محفوظات الأوامر هو آخر أمر تركته في

ThePhilosopher picture
في ٢٧ مايو ٢٠١٨
2

لحذف آخر 10 إدخالات (بناءً على مثالك):

history -d 511 520