원격 컴퓨터에서 grep을 수행하고 해당 단어가 포함된 줄을 인쇄하는 방법은 무엇입니까?

원격 컴퓨터에서 grep을 수행하고 해당 단어가 포함된 줄을 인쇄하는 방법은 무엇입니까?

아래와 같이 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단어가 포함된 줄도 인쇄합니다. 마찬가지로 attributemetadata단어도 마찬가지입니다.

또한 변수에 쉼표로 구분된 단어가 있습니다 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'

그리고 -Fgrep의 옵션에 추가하십시오.

관련 정보