É muito comum utilizarmos o comando grep do Linux com a intenção de filtrar algum resultado de outro comando de forma que ele exiba somente aqueles resultados que contenham uma determinada expressão (ou string) que você deseja. Porém, imaginemos a seguinte situação: eu quero filtrar a saída de um comando de modo que ele exiba somente as saídas que NÃO contenham uma palavra. Ou seja, basicamente você está fazendo o inverso do que o faz o uso convencional do grep. Para isso, basta utilizar a opção -v do comando.
Exemplo:
Suponha que eu deseje listar e ver todos os detalhes de uma pasta. A seguir, o resultado do comando ls -l sem nenhum filtro:
silvio@hostname:~$ ls -l total 1360 -rw-r--r-- 1 root root 758530 Oct 20 14:31 arquivos_originais.txt drwxr-xr-x 8 silvio silvio 4096 Nov 6 2014 backup_admin -rw-r----- 1 silvio silvio 506234 Oct 20 14:14 banco_de_dados.csv drwxr-xr-x 2 silvio silvio 4096 Nov 15 12:50 cache drwxr-xr-x 3 silvio www-data 4096 Jul 10 16:20 Desktop drwxr-xr-x 2 silvio www-data 4096 Oct 29 2014 Documents drwxr-xr-x 4 silvio www-data 12288 Dec 4 12:23 Downloads
Suponhamos agora que eu deseje filtrar somente as linhas que contenham a string “banco_de_dados”. Dessa forma, o comando seria:
ls -l |grep "banco_de_dados"
E o resultado seria:
silvio@hostname:~$ ls -l | grep "banco_de_dados" -rw-r----- 1 silvio silvio 506234 Oct 20 14:14 banco_de_dados.csv
Agora, suponhamos que eu queira o contrário, ou seja, quero que ele exiba todas as linhas, menos as que contenham a string “banco_de_dados”. Dessa forma, o comando deveria ser:
ls -l |grep -v "banco_de_dados"
E o resultado seria:
silvio@hostname:~$ ls -l total 1360 -rw-r--r-- 1 root root 758530 Oct 20 14:31 arquivos_originais.txt drwxr-xr-x 8 silvio silvio 4096 Nov 6 2014 backup_admin drwxr-xr-x 2 silvio silvio 4096 Nov 15 12:50 cache drwxr-xr-x 3 silvio www-data 4096 Jul 10 16:20 Desktop drwxr-xr-x 2 silvio www-data 4096 Oct 29 2014 Documents drwxr-xr-x 4 silvio www-data 12288 Dec 4 12:23 Downloads