패턴 검색을 위해 SSH를 사용하여 원격으로 grep 명령을 실행하고 싶습니다.
아래 스크립트를 사용했지만 작동하지 않습니다. 제안해주세요.
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
답변1
귀하의 코드:
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
- 아마도 백슬래시를 올바르게 읽으려면 이 작업을 수행
read
해야 할 것 입니다.read -r -p ... pattern
- 이것을 실제 호스트 이름에 대한 자리 표시자로 사용하고 있는지 (내 생각에는) 이것이 유틸리티 실행을 위한 값을 얻을 것이라고
hostname
생각하는지 확실하지 않습니다 .host
hostname
- 마지막 줄에는 끝나지 않은 작은따옴표 문자열이 있습니다. 작은따옴표로 끝나더라도
$pattern
작은따옴표로 인해 변수가 확장되지 않습니다. 이것은cd
불필요합니다. 변수$host
확장에는 따옴표가 필요하며 명령줄 플래그는 호스트 이름 앞에 와야 합니다(그러나-t
이 경우는 아님).
제안:
read -r -p "please enter the pattern:" pattern
host=hostname
ssh "$host" find /path -type f -name "'*.gz'" -exec zgrep -e "'$pattern'" /dev/null {} '\;' | grep -F 'Status=completed;'
여기의 명령은 find
원격 호스트의 모든 파일을 찾고 *.gz
해당 파일에서 패턴을 찾는 데 사용됩니다. 그런 다음 결과는 마지막 결과를 기준으로 추가로 (로컬로) 필터링됩니다. 이것이 마지막 패턴의 일부가 되어야 하는지 잘 모르겠습니다. 거기에 없으면 삭제하십시오./path
zgrep
$pattern
grep
;
"'*.gz'"
세련된 인용을 위해 사용이 필요합니다 . "'$pattern'"
로컬 셸은 호출 전에 첫 번째 수준의 따옴표를 제거하고 원격 측 명령에 대해 and (값이 무엇 이든)를 ssh
남겨 둡니다 .'*.gz'
'...'
$pattern
find
일치하는 파일의 파일 이름이 출력에 표시되도록 항상 두 개 이상의 파일( 및 에서 다른 파일 하나 )을 수신하는지 확인 zgrep ... /dev/null ...
합니다 .zgrep
/dev/null
/path
grep -F
주어진 문자열을 정규식 대신 고정 문자열로 처리합니다. 문서화와 처리 속도 향상을 위해 여기에 있습니다.