HISTTIMEFORMAT 및 일치하는 기록 항목 삭제

HISTTIMEFORMAT 및 일치하는 기록 항목 삭제

특정 문자열과 일치하는 모든 기록 항목을 삭제하고 싶습니다. 내가 찾은 이 방법:

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

그러나 HISTTIMEFORMAT 주석은 고려하지 않습니다. 예를 들면 다음과 같습니다.

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

"echo 2"를 제거하려면 앞의 주석도 제거해야 합니다. 어떻게 해야 하나요?

답변1

sed는 당신의 친구입니다(awk도 가능합니다). 이 코드를 사용할 수 있습니다(일치하는 각 줄에 대한 타임라인이 있다고 가정).

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

또는 기록 파일에서 직접 수행합니다.

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

귀하의 예는 다음과 같습니다:

#1517681911
echo 1
#1517681931
echo 3

더 제한적인 일치: 패턴 앞의 실제 타임라인만 제거합니다(필드 # 뒤에 10자리가 있는 줄과 일치).

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

관련 정보