O requisito para manter entradas de várias linhas, mesmo se a primeira linha corresponder a um padrão "ignorar", adicionou alguma complexidade. Acabei escrevendo uma máquina de estado finito no Awk para filtrar HISTFILE depois que ela foi gravada no disco (não consegui encontrar uma maneira de acionar a filtragem antes que ela já tivesse sido gravada).
~ / .bashrc:
# if shell is interactive, filter history upon exit
if [[ $- == *i* ]]; then
trap '$HOME/.bash_history_filter >/dev/null 2>&1 &' EXIT
fi
~ / .bash_history_filter:
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_history_filter.awk:
/^#[[:digit:]]{10}$/{timestamp=$0histentry=""
next
}
$1 ~ /^(ls?|man|cat)$/ {
if (! timestamp) {
print
} else {
histentry = $0
}
next
}
timestamp {
print timestamp
timestamp = ""
}
histentry {
print histentry
histentry = ""
}
{ print }
Algumas postagens relacionadas ( aqui e aqui ) me levam a suspeitar que isso também pode ser feito usando sed. Eu ainda não percebi isso, mas eu ficaria curioso para ver como isso é comparado.