Executa vários comandos piped grep a partir de uma lista no bash

0

Como parte do meu trabalho de segurança, analiso dezenas de arquivos históricos do Google Chrome todos os dias usando o sqlite3 sobre SSH.

Existem algumas dezenas de sites "seguros" autorizados para os quais cada usuário pode navegar. Para os meus propósitos, não me importo com esses sites seguros. Para listar os URLs de cada arquivo de histórico e ignorar os sites seguros, eu uso grep -v e listo cada site seguro da seguinte forma:

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -v safesite1.com | grep -v safesite2.com | grep -v safesite3.com | grep -v safesite4.com

e assim por diante. Meu comando cresceu para pelo menos 20 linhas e está se tornando incontrolável. Existe alguma maneira de mostrar a lista de URLs do usuário, excluindo meus sites seguros em um formato listado? Estou imaginando algo como:

safesite1.com
safesite2.com
safesite3.com

e, em seguida, trazendo essa lista para o comando. Pode ser interno ou externo - eu realmente não me importo, desde que acabe saindo no bash.

Obrigado por qualquer ajuda que você possa me dar!

    
por Jared Dalton 02.02.2016 / 01:31

4 respostas

1

Acho que o que você está procurando é algo como

grep -vf safe_websites inputfile

-v para inverter as correspondências que você já conhece e -f é para obter padrões do arquivo safe_websites .

    
por 02.02.2016 / 01:34
0

Outra opção que você pode considerar é usar a forma egrep do grep, que permitirá usar expressões regulares estendidas para que você possa colocar vários destinos em uma única string:

egrep -v "safesite1\.com|safesite2\.com|safesite3\.com"

Detalhes dessas e outras REs estendidas podem ser obtidas em man 7 re_format .

    
por 03.02.2016 / 05:17
0

Como mencionado, você deve usar a opção -f para grep e fornecer uma lista de padrões para usar grep .

No entanto, você também menciona ter caracteres especiais em seus URLs, o que faz sentido. A resposta correta é usar o -F flag para grep para considerar apenas os padrões como sequências fixas.

Para realizar o que você deseja:

Primeiro, coloque sua lista de sites seguros em um arquivo, por exemplo /tmp/safelist.txt . Isso deve ser algo como:

safesite1.com
safesite2.com
safesite3.com

Em seguida, chame grep nesse arquivo da seguinte forma:

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -vFf /tmp/safelist.txt
    
por 03.02.2016 / 05:58
-1

Acontece que meu problema tinha a ver com os dados que eu estava tentando analisar. Se eu tentei usar a saída de teste

a
b
c
d
e

e, em seguida, usando grep -vf file.txt para remover a, b e c, funcionou como um encanto. Desde que eu estava tentando ignorar um monte de sites com uma variedade de caracteres especiais, nunca funcionou para mim, mesmo ao tentar manipular um arquivo .txt de saída da minha consulta sql.

Minha solução para tornar meu comando mais legível, em última análise, foi usar a barra invertida ( \ ) para dividir meu comando em várias linhas e facilitar a leitura:

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | \
grep -v safesite1.com | \
grep -v safesite2.com | \
grep -v safesite3.com | \
grep -v safesite4.com | \
grep -v safesite5.com

Obrigado pela sua ajuda a todos!

    
por 02.02.2016 / 21:45

Tags