Si desea conservar el archivo .gz
, puede utilizar el siguiente :$ gunzip -c inputfile.gz >outputfile
Требование о сохранении нескольких -строковых записей, даже если первая строка соответствует шаблону «игнорировать», добавляло некоторую сложность. В итоге я написал конечный -конечный автомат в 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
~/.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. Я еще не разобрался с этим, но мне было бы любопытно посмотреть, как это сравнится.
для полноты, вот как я работаю с историей 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"
Надеюсь, это будет кому-нибудь полезно!