Como combinar o fluxo contra a lista branca e a lista negra?

0

Como posso duplicar um fluxo de tubos (saída de outro programa) para que, para cada linha, eu possa verificar se ele corresponde a expressões regulares independentes (idealmente, reutilize um comando grep com opções como -i etc.) mas processar os resultados de cada expressão separadamente?

Eu quero definir o código de saída da minha função check da seguinte forma:

  • nenhuma linha no fluxo corresponde a blacklist ; AND
  • pelo menos uma linha no fluxo corresponde a whitelist

Eu quero processar linhas na memória sem armazená-las em arquivo, reportar o código de saída e passar o fluxo original para outro programa usando pipes (log whitelist corresponde a stderr ou em outro lugar também seria útil).

O uso seria parecido com:

fetch-big-stream | check whitelist blacklist | cat
exitcode=$?

em que fork duplica linhas, whitelist e blacklist são funções e check repassa a cópia do fluxo para cada separadamente e termina quando o código de saída puder ser determinado antes de EOF . Há também um problema com a implementação de | que não propaga código diferente de zero.

    
por Rumca 24.02.2014 / 22:35

2 respostas

2

Use apenas '-f' e '-v' com grep:

$ cat white
foo
bar
$ cat black
baz
$ cat input
foo
foo baz
foo bar
baz

$ grep -f white input | grep -v -f black
foo
foo bar
    
por 24.02.2014 / 22:58
1

Acho que o que você está tentando fazer é relatar arquivos que contenham pelo menos um dos padrões em good.txt e nenhum deles em bad.txt . Se você quiser fazer isso para um único arquivo, é trivial:

grep -Ff good.txt file | grep -vFf bad.txt 

Se você quiser encontrar todos os arquivos em um diretório que corresponda aos critérios, poderá fazer algo assim (observe que ele também corresponderá a good.txt se estiver no mesmo diretório):

grep -lFf good.txt * | xargs -I{} grep -lvFf bad.txt {}

Você pode ajustar um pouco mais usando find . Por exemplo, evite corresponder good.txt :

find . -type f -not -name good.txt -exec grep -lFf good.txt {} \; | 
 xargs -I{} grep -l a {}
    
por 24.02.2014 / 23:09

Tags