Intereting Posts
Как переименовать несколько файлов с префиксом и суффиксом с помощью команды find Как проверить, включен ли Wi-Fi в режиме Hotspot (AP) Команда sudo является неприемлемой при вызове из файлового менеджера Как сделать снимок экрана при использовании Gnome? Есть ли в Linux Linux-драйвер SDIO для пользователя? В то время как проверка состояния JBoss в цикле вниз или нет, Пакеты, не перемещающиеся через linux ethernet bridge Проверьте, включен ли дисплей в Linux Скопировать одно значение из файла в переменную и выполнить арифметику над ним? Как добавить слово для строки, в которой выполняется транспонирование Как определить, есть ли какой-то параметр энергосбережения, который отключил процессор в Linux Когда я cd через символическую ссылку, почему pwd показывает символическую ссылку вместо реального пути? Как запустить awk для некоторого количества строк.? Как настроить SSH, чтобы OTP можно было использовать с идентификатором ssh-copy-id, и тогда разрешена авторизация только для ключей? Как мне преобразовать «последние измененные» даты в конкретном каталоге?

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

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

$ 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) 

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

Команда 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 ошибку, если совпадений больше нет. Игнорируй это.