상태 정보를 표준 오류로 인쇄하는 명령의 표준 오류를 필터링하고 싶습니다. 이 경우,보그 백업. 특히 기본 출력에는 다음 borg check
과 같은 줄이 포함됩니다.
Checking segments ...
표준 오류로 보냅니다. cron 작업에 번거롭기 때문에 이 줄을 필터링하고 싶습니다. 현재(현재 1.0.2
) borg
이 출력은 구성을 통해 비활성화할 수 없습니다.
나는 사용했다Gilles가 설명한 방법. 이는 로컬 Borg 저장소에 적합합니다. 예를 들면 다음과 같습니다.
{ borg check '/media/faheem/My Passport/backup-Mail' 2>&1 1>&3 | tr '\r' '\n' | grep -v "^Checking segments" 1>&2; } 3>&1
그러나 원격 저장소의 경우 상황이 약간 다릅니다. 출력은 다음과 같습니다.
Remote: Checking segments 99.3%
Remote:
이 두 가지 상황을 제거하기 위해 역방향 grep을 어떻게 수정합니까?
{ borg check faheem@ramnode:/mnt/backup-Mail 2>&1 1>&3 | tr '\r' '\n' | grep -v ":Checking segments" 1>&2; } 3>&1
첫 번째 경우에는 작동하지만 두 번째 경우에는 작동하지 않습니다 Remote:
. 두 개의 grep을 사용할 수 있지만 하나의 표현식을 사용하는 것을 선호합니다.
답변1
grep에서 메시지를 필터링하려면 -E
확장 정규식 플래그( ?
아래의 "0 또는 1" 의미)와 -v
역방향 일치를 도입하세요.
grep -Ev '^Remote:( Checking segments [[:digit:]]{1,3}\.[[:digit:]]%)?$'
이는 다음 행이 (역방향으로) 일치해야 함을 의미합니다.
- 줄의 시작
^
- 끈
Remote:
- 다음 중 0개 또는 하나와 일치하는 그룹화된
(
...)
문자 집합(앞에 공백 포함) :Checking segments ...
?
- 이
[[:digit:]]
부분은 1~3자리 숫자, 마침표, 숫자,%
기호 순으로 일치한다는 의미입니다. - 모두 줄 끝에 고정됨
$
OP의 추가 설명에 따라 최종 grep은 다음과 같습니다.
grep -Ev "^Remote:\s*(Checking segments.*)?$"
"Remote:"라는 단어 와 일치하는 모든 줄을 제거하고( ^
줄의 시작 부분에서 시작) 공백을 제거하거나 공백을 제거한 후 다음을 수행합니다.
아무것도 아니면
"세그먼트 확인"이라는 문구 자체 뒤에는 임의의 문자(또는 문자 없음)가 옵니다.
.*
...그리고 줄의 끝$