Как удалить команды в истории, соответствующие заданной строке?

Мне нужно удалить все команды в моей истории, соответствующие строке. Я пробовал:

$ history | grep searchstring | cut -d" " -f2 | history -d -bash: history: -d: option requires an argument $ history | grep searchstring | cut -d" " -f2 | xargs history -d xargs: history: No such file or directory $ temparg() { while read i; do "$@" "$i"; done } $ history | grep searchstring | cut -d" " -f2 | temparg history -d (no error, but nothing is deleted) 

Каков правильный способ сделать это?

4 Solutions collect form web for “Как удалить команды в истории, соответствующие заданной строке?”

Команда history работает только с вашим файлом истории $HISTFILE (обычно ~/.history или ~/.bash_history ). Это будет намного проще, если вы просто удалите строки из этого файла, что можно сделать разными способами. grep – это один из способов, но вы должны быть осторожны, чтобы не перезаписывать файл во время его чтения:

 $ grep -v searchstring "$HISTFILE" > /tmp/history $ mv /tmp/history "$HISTFILE" 

Другой способ – с sed :

 $ sed -i '/searchstring/d' "$HISTFILE" 

Ответ Майкла Мрозека будет работать, если вы не хотите удалять команды из текущего сеанса. Если вы это сделаете, вы должны написать в файл истории, прежде чем выполнять операции на своем посту, выполнив history -a .

Кроме того, после удаления записей из файла истории вы можете перезагрузить его, отправив history -c , затем history -r .

Основываясь на ответах Майкла и Криса , я придумал следующее. Добавьте его в файл ~/.bashrc а затем загрузите его . ~/.bashrc . ~/.bashrc или source ~/.bashrc .

 :<<COMMENT Deletes all lines from the history that match a search string, with a prompt. The history file is then reloaded into memory. Examples hxf "rm -rf" hxf ^source See: - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string COMMENT #The unalias prevents odd errors when calling". ~/.bashrc" (May result in #"not found" errors. That's okay). unalias hxf hxf() { read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response response=${response,,} # tolower if [[ $response =~ ^(yes|y)$ ]] then #Delete all matched items from the file, and duplicate it to a temp #location. echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history" grep -v "$1" "$HISTFILE" > /tmp/history #Clear all items in the current sessions history (in memory). This #empties out $HISTFILE. echo "history -c" history -c #Overwrite the actual history file with the temp one. echo -e "mv /tmp/history \"$HISTFILE\"" mv /tmp/history "$HISTFILE" #Now reload it. echo -e "history -r \"$HISTFILE\"" history -r "$HISTFILE" #Alternative: exec bash else echo "Cancelled." fi } 

Для тех, кто ищет однострочный:

 while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done 

Итак, если вы хотите, например. удалите несколько строк с паролем в нем, просто замените «SEARCH_STRING_GOES_HERE» на пароль. Это приведет к поиску всей вашей истории для этой строки поиска и удалению ее.

2 вещи, которые нужно знать

  • grep использует regex, если вы не поставили -F в качестве аргумента
  • Команда покажет 1 ошибку, если совпадений больше нет. Игнорируй это.
  • удалять файлы после вставки в tarball
  • Как рассказать xargs, какой аргумент выбрать?
  • Один лайнер, чтобы увидеть, вернул ли grep что-то?
  • Копирование папки с помощью xargs
  • Возможно ли, чтобы ls поддерживал порядок своих входов
  • Есть ли способ сделать этот однострочный лайнер быстрее?
  • Получить имя файла после find -name | xargs
  • Как процитировать аргументы с помощью xargs
  • Используйте массив bash в качестве списка аргументов в списке (с помощью Midnight Commander)
  • Как передать строки с одинарными кавычками в grep?
  • команда после команды grep не работает
  • Linux и Unix - лучшая ОС в мире.