grep 필터에서 스크립트가 반환한 값을 어떻게 사용합니까?

grep 필터에서 스크립트가 반환한 값을 어떻게 사용합니까?

저는 FreeBSD의 csh를 사용하고 있습니다. 사용자의 도메인으로 행을 구성한 다음 해당 행을 사용하여 exim 메일 로그를 필터링하여 해당 사용자의 도메인과만 메시지를 주고받고 싶습니다.

DirectAdmin 도메인 목록에서 행을 구성하는 스크립트를 작성했습니다.

#!/bin/sh
user="some-user"

    list=$(cat /usr/local/directadmin/data/users/$user/domains.list)
    domaincount=$(echo $list|wc -w)
    echo $list| tr ' ' '|'

'domain.com'이 스크립트를 실행하면 다음과 같은 필드가 포함된 행이 반환됩니다.'domain1.com|domain2.net'

grep이제는 매개 변수로 사용하고 싶지만

cat /var/log/exim/mainlog |egrep `/path/to/rowscript`

아무것도 반환하지 않지만 수동으로 결과를 바꾸면 /path/to/rowscript내가 보고 싶은 결과가 반환됩니다.

사용해 보세요

grep -E "`/path/to/rowscript`", 
egrep '`/path/to/rowscript`' 
egrep `/bin/sh /path/to/rowscript`
egrep $(/path/to/rowscript)
    getting "Illegal variable name."

기다렸지만 여전히 운이 없습니다.

그건 그렇고, date백틱은 잘 작동합니다.

cat /var/log/exim/mainlog | grep `date +%Y-%m-%d`

내가 뭘 잘못했나요?

답변1

스크립트는 작은따옴표를 출력해서는 안 됩니다. 당신이 글을 쓸 때

egrep 'foo|bar'

작은따옴표는 쉘 구문의 일부입니다. 그들은 그 안에 있는 캐릭터를 확장으로부터 보호합니다. 스크립트 출력에 작은따옴표가 나타나면 일반 문자로 처리됩니다. 그냥 생략하세요.

스크립트를 작성하는 더 쉬운 방법이 있습니다. 줄 바꿈을 파이프 기호로 바꾸고 마지막 기호를 제거하는 것입니다.

list=$(</usr/local/directadmin/data/users/$user/domains.list tr '\n' '|')
echo "${list%|}"

고정된 문자열 세트를 찾고 있다면 이 작업을 수행할 필요가 없습니다. 대신 -F옵션을 사용하여 grep고정 문자열을 찾도록 지시하고 -f옵션을 사용하여 파일에서 패턴 목록을 읽도록 지시하십시오.

grep -Ff /usr/local/directadmin/data/users/bob/domains.list

domain.com파일 내에 파일을 포함 하면 검색 시 더 긴 문자열에 대한 일치 항목도 반환됩니다. otherdomain.com따라서 스크립트를 사용하여 시작과 끝에 앵커가 있는 패턴을 작성하여 거짓 일치를 피할 수 있습니다. 예를 들어 이름 주위에 공백이 있는 경우 exim 로그에 어떤 종류의 구두점이 있는지 모르겠습니다.

#!/bin/sh
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
echo " (${list%|}) "

그리고 전화해

</var/log/exim/mainlog grep -E `/path/to/rowscript bob`

또는 스크립트 호출 grep을 수행하십시오.

#!/bin/sh
shift
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
grep -E " (${list%|}) " -- "$@"

~라고 불리는

</var/log/exim/mainlog /path/to/rowscript bob

관련 정보