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
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:
blacklist
; AND 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.
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
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 {}