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
.
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!
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
.
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
.
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
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!