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

Чистые страницы являются страницами, которые не были изменены, так как они были отображены (обычно, текстовые разделы из общих библиотек только читаются из диска (когда необходимый), никогда изменяемый, таким образом, они будут на общих, чистых страницах).
Грязные страницы являются страницами, которые не являются чистыми (т.е. были изменены).

Частные страницы доступны только тому процессу, поделившиеся страницы отображаются другим processes*.

RSS является общим количеством страниц, поделившихся или нет, в настоящее время отображаемый в процесс. Так Shared_Clean + Shared_Dirty была бы общая часть RSS (т.е. часть RSS, который также отображается в другие процессы), и Private_Clean + Private_Dirty половой орган RSS (т.е. только отображенный в этом процессе).

PSS (пропорциональный размер доли) - как Вы описываете. Частным страницам подводят итог, как, и размер каждого общего отображения разделен на количество процессов, которые совместно используют его.
Таким образом, если бы процесс имел 100k частные страницы, 500k страницы, поделившиеся с еще одним процессом и 500k, совместно использованным с четырьмя другими процессами, то PSS был бы:

100k + (500k / 2) + (500k / 5) = 450k

Дополнительные материалы для чтения:

Относительно сумм всего процесса:

  • RSS может быть (приблизительно +) получен путем подведения итогов Rss: записи в smaps (Вы не должны складывать общие/частные общие/грязные записи).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Можно подвести итог Pss: оценивает тот же путь, для получения глобальным процессом PSS.
  • USS в не сообщают smaps, но действительно, это - сумма частных отображений, таким образом, можно получить его то же слишком

*Обратите внимание, что "совместно используемая" страница считается как частное отображение, пока она на самом деле не совместно используется. т.е. если существует только один процесс в настоящее время с помощью libfoo, текстовый раздел той библиотеки появится в частных отображениях процесса. Это будет считаться в общих отображениях (и удаляться из частных), только, если/когда другой процесс начнет пользоваться той библиотекой.
Значения +The не складывают точно для всех процессов. Не абсолютно уверенный, почему... прошу прощения.

13
08.12.2012, 00:35
4 ответа

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

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

Иначе с sed:

$ sed -i '/searchstring/d' "$HISTFILE"
17
27.01.2020, 19:52
  • 1
    Хороший ответ; $HISTFILE мог содержать пробелы, которые вероятно, стоит заключить его в кавычки. –  Chris Down 07.12.2012, 22:50
  • 2
    Осторожный... histfile непредсказуем, если у Вас есть много открытых оболочек, это не сообщение, что точно будет сохранено и в какой порядок. Кто-либо может подтвердить, что уже открытые оболочки не перепишут историю, которую они загрузили при инициализации при закрытии? –  orion 13.01.2015, 19:02

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

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

8
27.01.2020, 19:52

на основе Michael и Chris ' Ответы, я придумал следующее. Добавьте его в свой файл ~ / .bashrc , а затем загрузите его либо . ~ / .bashrc или Источник ~ / .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
}
2
27.01.2020, 19:52

Для тех, кто ищет односложную инструкцию:

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 ошибку, когда больше не будет совпадений. Игнорируйте ее.
2
27.01.2020, 19:52

Теги

Похожие вопросы