더 많은 키워드 필터링에 대한 Bash 스크립트

더 많은 키워드 필터링에 대한 Bash 스크립트

시간 내 주셔서 감사합니다.

아래와 같이 bash 스크립트에서 여러 키워드01(keyword02, 키워드03....)을 필터링하고 싶습니다. 이것을 어떻게 얻을 수 있나요?

모든 키워드 알림을 동일한 이메일 주소로 보내십시오.

tail -f /var/log/auth.log | while read line do case "$line" in
        *"keyword01"*) echo "$line" | mutt -s "Email notice title" [email protected];
        ;;    esac 
done

답변1

어쩌면 좋아

tail -f /var/log/auth.log |
  awk -v cmd='exec mutt -s "Email notice title" [email protected]' '
    /keyword1|keyword2/ {print | cmd; close(cmd)}'

일반적으로 텍스트를 처리하기 위해 쉘 루프를 사용하는 것을 피하지만 다음과 같이 할 수도 있습니다.

tail -f /var/log/auth.log |
  while IFS= read -r line; do
    case "$line" in
      (*"keyword1"* | *"keyword2"*) 
        printf '%s\n' "$line" |
          mutt -s "Email notice title" [email protected];;
    esac 
  done

에서는 zsh를 사용할 수도 있습니다 *("keyword1"|"keyword2")*. 또는 , .kshbash -O extglob*@("keyword1"|"keyword2")*

이 Q&A에서는 루프를 사용하여 텍스트를 처리하는 것이 나쁜 습관이라고 생각합니다., 그러나 여기서는 이 줄에서 명령을 실행해야 합니다. 이는 단순한 텍스트 처리가 아니라 명령을 실행하는 셸 작업입니다.

여기서 파일 읽기와 텍스트 매칭은 with보다 효율이 떨어지지 awk만 실행할 명령줄을 해석하고 실행하기 위해 쉘이 호출되기 mutt때문에 실행하는 것이 더 효율적입니다 .awkmutt

이는 의 약어 와 마찬가지로 tail -f file의 약어입니다 . 즉, 파일의 마지막 10줄을 인쇄한 다음 다음을 입력합니다.tail -n 10 -f filetail filetail -n 10 file따르다나중에 파일에 추가된 모든 내용을 인쇄하는 모드입니다.

제 생각에는 다음을 사용하여 tail -n+1 -f file전체 파일을 인쇄 해야 한다고 생각합니다.다음과 같은, 아니면 tail -n0 -f file지금부터 파일에 추가될 내용을 인쇄하세요.

-F일부 구현 tail에서 이름 변경을 감지하는 옵션 도 참조하세요 . 일반적으로 회전 후에는 새 이름으로 이름이 변경 /var/log/auth.log됩니다 . 새 파일로 전환하려는 경우 동일한 파일(현재 이름이 변경됨 ) 을 계속 시청하게 됩니다 ./var/log/auth.log.1/var/log/auth.logtail -f/var/log/auth.logtail -F

관련 정보