아래와 같이 machineB
이 디렉토리 아래 에 로그 파일이 거의 없습니다 . 로그 파일이 꽤 큽니다./opt/ptd/Logs/
david@machineB:/opt/ptd/Logs$ ls -lt
-rw-r--r-- 1 david david 49651720 Oct 11 16:23 ptd.log
-rw-r--r-- 1 david david 104857728 Oct 10 07:55 ptd.log.1
-rw-r--r-- 1 david david 104857726 Oct 10 07:50 ptd.log.2
machineB
특정 패턴에 대해 모든 로그 파일을 구문 분석하고 해당 패턴이 있는 줄을 인쇄해야 하는 일반 쉘 스크립트를 작성하려고 합니다 . 나는 모든 SSH 키 설정이 있는 아래 쉘 스크립트를 실행할 것입니다. machineA
즉, machineA에서 machineB의 로그 파일을 원격으로 grep해야 한다는 의미입니다.
#!/bin/bash
wordsToInclude="hello,animal,atttribute,metadata"
wordsToExclude="timeout,runner"
# now grep on the various log file for above words and print out the lines accordingly
즉, 변수에 쉼표로 구분된 단어가 있습니다 wordsToInclude
. 로그에 hello
단어가 포함되어 있으면 해당 줄을 인쇄하고 animal
단어가 포함된 줄도 인쇄합니다. 마찬가지로 attribute
및 metadata
단어도 마찬가지입니다.
또한 변수에 쉼표로 구분된 단어가 있습니다 wordsToExclude
. 줄에 해당 단어가 포함되어 있으면 해당 줄을 인쇄하지 마세요.
지금은 단어를 저장하기 위해 위의 형식을 사용하지만 더 나은 형식도 괜찮습니다. wordsToInclude
변수 에 긴 단어 목록이 있을 수 있으므로 wordsToExclude
해당 변수에 저장하려고 합니다.
작은 변수 세트에 대해 grep을 수행하는 방법을 알고 있습니다. machineB의 명령줄에서 직접 grep을 수행해야 하는 경우 다음과 같이 수행합니다.
grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout'
그러나 machineA의 machineB에서 원격 SSH grep을 수행할 수 있도록 쉘 스크립트에서 이것을 어떻게 결합해야 하는지 잘 모르겠습니다.
답변1
다른 형식을 사용하고 싶다면 다음을 고려하세요.
inc="hello|animal|atttribute|metadata"
exc="timeout|runner"
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"
더 빠른 대안
로그 파일이 크고 화려한 정규 표현식이 아닌 고정 단어를 찾는 경우 다음 접근 방식을 고려해 볼 수 있습니다.
inc='hello
animal
atttribute
metadata'
exc='timeout
runner'
ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"
각 단어를 별도의 줄에 배치하면 고정 문자열에 대한 grep 기능을 사용할 수 있습니다 -F
. 이렇게 하면 정규식 처리가 꺼지고 프로세스가 더 빨라집니다.
답변2
불가능해 보일 수도 있지만 적절한 파일이 아닌 환경 변수에 있더라도 grep
의 -f
옵션을 사용하여 해당 단어 목록을 활용할 수 있습니다. 비결은 grep
다음과 같은 파일에서 왔다고 속이는 것입니다.
$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'
grep ...
그러면 machineB를 통해 원격으로 명령이 실행됩니다 ssh
. 변수를 가져와서 $wordsToInclude
쉼표를 줄 끝 문자( ,
-> \n
)로 전환합니다. 이 단어 목록은 스위치 grep
를 통해 입력됩니다 -f
.
제외 목록을 통해 이를 실행하려면 파이프를 통해 초기 grep 다음에 두 번째 grep으로 추가하기만 하면 됩니다.
$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \
file1 file2 file3 | grep -vf <(echo $wordsToExclude)'
답변3
SSH는 다음과 같은 명령으로 실행됩니다.
ssh host command
또는 귀하의 경우:
ssh -t machineB "grep -E \"$wordsToInclude\" ptd.log | grep -v \"$wordsToExclude\""
-t
"ioctl 오류"를 방지합니다 . 또한 속도를 높이기 위해 다음과 같이 grep의 고정 단어를 사용하는 것이 좋습니다.이 답변작성자: @John1024 다음과 같이 각 단어를 한 줄에 입력하세요.
wordsToInclude='hello
animal
atttribute
metadata'
wordsToExclude='timeout
runner'
그리고 -F
grep의 옵션에 추가하십시오.