HISTTIMEFORMAT e excluindo entradas de histórico correspondentes

0

Gostaria de excluir todas as entradas do histórico que correspondam a uma determinada string. eu encontrei este método :

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

mas não considera os comentários do HISTTIMEFORMAT, por exemplo:

#1517681911
echo 1
#1517681918
echo 2
#1517681931
echo 3

Se eu quisesse remover "echo 2", o comentário anterior precisaria ser removido também. Como posso fazer isso?

    
por Steven Penny 03.02.2018 / 20:04

1 resposta

1

Sed é seu amigo (o awk também pode fazer isso), você pode usar esse código (supondo que cada linha correspondida tenha uma linha do tempo):

sed '$!N;/echo 2/!P;D' "$HISTFILE" > /tmp/history

ou para fazer isso diretamente no arquivo de histórico:

sed -i '$!N;/echo 2/!P;D' "$HISTFILE"

O exemplo que você tem se tornará:

#1517681911
echo 1
#1517681931
echo 3

Uma correspondência mais restritiva: apaga apenas linhas de tempo reais antes do padrão (linhas de correspondência que têm um campo que é um # seguido por dez dígitos)

awk -vp="echo 2" ' {b=$0};b~p{next}
                   NF=1 && b~/#[0-9]{10}/{a=b;next}
                   {print(a RS b)}
                 ' "$HISTFILE"
    
por 03.02.2018 / 22:47