![더 많은 키워드 필터링에 대한 Bash 스크립트](https://linux55.com/image/216726/%EB%8D%94%20%EB%A7%8E%EC%9D%80%20%ED%82%A4%EC%9B%8C%EB%93%9C%20%ED%95%84%ED%84%B0%EB%A7%81%EC%97%90%20%EB%8C%80%ED%95%9C%20Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8.png)
시간 내 주셔서 감사합니다.
아래와 같이 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")*
. 또는 , .ksh
bash -O extglob
*@("keyword1"|"keyword2")*
이 Q&A에서는 루프를 사용하여 텍스트를 처리하는 것이 나쁜 습관이라고 생각합니다., 그러나 여기서는 이 줄에서 명령을 실행해야 합니다. 이는 단순한 텍스트 처리가 아니라 명령을 실행하는 셸 작업입니다.
여기서 파일 읽기와 텍스트 매칭은 with보다 효율이 떨어지지 awk
만 실행할 명령줄을 해석하고 실행하기 위해 쉘이 호출되기 mutt
때문에 실행하는 것이 더 효율적입니다 .awk
mutt
이는 의 약어 와 마찬가지로 tail -f file
의 약어입니다 . 즉, 파일의 마지막 10줄을 인쇄한 다음 다음을 입력합니다.tail -n 10 -f file
tail file
tail -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.log
tail -f
/var/log/auth.log
tail -F