![grep 필터에서 스크립트가 반환한 값을 어떻게 사용합니까?](https://linux55.com/image/19960/grep%20%ED%95%84%ED%84%B0%EC%97%90%EC%84%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EB%B0%98%ED%99%98%ED%95%9C%20%EA%B0%92%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
저는 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