원격 시스템에서 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. 즉, 머신 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'

-Fgrep의 옵션에 추가되었습니다 .

관련 정보