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
. 즉, 머신 A에서 머신 B의 로그 파일을 원격으로 가져와야 합니다.
#!/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
이러한 변수에 단어를 저장합니다.
나는 작은 변수 세트를 파악하는 방법을 알고 있습니다. 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'"
-F
각 단어를 별도의 줄에 배치하면 grep의 고정 문자열 기능을 사용할 수 있습니다 . 이렇게 하면 정규식 처리가 꺼지고 프로세스가 더 빨라집니다.
답변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의 옵션에 추가되었습니다 .