Como usar um valor retornado por um script no filtro grep?

3

Eu estou no csh do FreeBSD. Eu quero formar uma linha com domínios de um usuário e, em seguida, usar essa linha para filtrar o maillog do exim para obter somente emails de / para os domínios desse usuário.

Eu escrevi um script para formar uma linha a partir de uma lista de domínios DirectAdmin:

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

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

A execução desse script retorna linhas com domínios como este: 'domain.com' ou this: 'domain1.com|domain2.net'

Agora eu quero usar isso como um argumento para grep , mas

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

não retorna nada, enquanto substituir manualmente /path/to/rowscript por seu resultado retorna o que eu quero ver.

Tentou usar

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

etc, mas ainda sem sorte.

BTW, date nos backticks funcionam bem:

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

O que estou fazendo de errado?

    
por Drey 13.11.2011 / 20:40

1 resposta

3

Seu script não deve gerar aspas simples. Quando você escreve

egrep 'foo|bar'

as aspas simples fazem parte da sintaxe do shell. Eles protegem os personagens dentro deles contra a expansão. Se aspas simples aparecerem na saída do seu script, elas serão consideradas como caracteres comuns. Simplesmente os omita.

Existe uma maneira muito mais fácil de escrever o seu script: substitua as novas linhas por símbolos de pipe e remova o último.

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

Você não precisa fazer isso se estiver procurando por um conjunto fixo de strings. Em vez disso, use a opção -F para grep para solicitar que ele procure por cadeias de caracteres fixas e a opção -f para solicitar que ele leia uma lista de padrões de um arquivo.

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

Se você tiver domain.com nesse arquivo, a pesquisa também retornará hits de strings mais longas, como otherdomain.com . Então você pode querer usar o seu script para construir um padrão que tenha âncoras no início e no final, então evite correspondências espúrias. Eu não sei que tipo de pontuação o log do exim tem; Por exemplo, se os nomes estiverem cercados por espaços em branco, você desejará algo como

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

e chame como

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

Ou faça o script chamar grep:

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

chamado como

</var/log/exim/mainlog /path/to/rowscript bob
    
por 13.11.2011 / 21:03