Как отфильтровать определенные команды из многострочной истории Bash при выходе из системы?

Si desea conservar el archivo .gz, puede utilizar el siguiente :$ gunzip -c inputfile.gz >outputfile

2
29.07.2017, 15:47
2 ответа

Требование о сохранении нескольких -строковых записей, даже если первая строка соответствует шаблону «игнорировать», добавляло некоторую сложность. В итоге я написал конечный -конечный автомат в Awk для фильтрации HISTFILE после того, как он был записан на диск (. Я не смог найти способ запустить фильтрацию до того, как он уже был записан ).

~/.bashrc:

# if shell is interactive, filter history upon exit
if [[ $- == *i* ]]; then
  trap '$HOME/.bash_history_filter >/dev/null 2>&1 &' EXIT
fi

~/.bash _история _фильтр:

tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT

filter_script="$HOME/.bash_history_filter.awk"
persisted_history="${HISTFILE:-$HOME/.bash_history}"

if [[ -r "$filter_script" && -r "$persisted_history" ]]; then
  awk -f "$filter_script" "$persisted_history" > "$tmpfile"

  mv "$tmpfile" "$persisted_history"
fi

Finite-state machine

~/.bash _история _filter.awk:

/^#[[:digit:]]{10}$/ {
  timestamp = $0
  histentry = ""
  next
}
$1 ~ /^(ls?|man|cat)$/ {
  if (! timestamp) {
    print
  } else {
    histentry = $0
  }
  next
}
timestamp {
  print timestamp
  timestamp = ""
}
histentry {
  print histentry
  histentry = ""
}
{ print }

Несколько связанных сообщений(здесь и здесь)наводят меня на мысль, что это также можно сделать с помощью sed. Я еще не разобрался с этим, но мне было бы любопытно посмотреть, как это сравнится.

2
27.01.2020, 22:18

для полноты, вот как я работаю с историей bash! (фильтр и резервное копирование)

Независимо от того, фильтруете вы или нет, HISTFILE недостаточно для того, кто заботится о своей истории, также не рекомендуется иметь большой HISTFILE, так что обязательно когда-нибудь вам понадобится хранить свою историю в другом месте!

function shellHist () #find old hist
{ 
    if [[ -f ${HISTFILE}.${1} ]]; then
        cat ${HISTFILE}.${1};
    else
        grep -h "${@:-.}" ${HISTFILE}.*;
    fi
}
function shellHistBackup () 
{ 
    [[ -n ${HISTFILE} ]] || return;
    # pidKill0 && return; # do nothing if the job is actually running elsewhere
    {
    while read histLine; do
        if ! grep -q "^${histLine}$" ${HISTFILE}.${histLine%% *} 2> /dev/null; then
            echo "${histLine}" >> ${HISTFILE}.${histLine%% *};
        fi;
    done < ${HISTFILE}
    for fltr in ls cat any ; do
        rm ${HISTFILE}.${fltr}
    done
    } & # pidLog # related to pidKill0
}

Я включаю shellHistBackup в "trap shellExit EXIT"

Надеюсь, это будет кому-нибудь полезно!

0
27.01.2020, 22:18

Теги

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