16 exemplos de comandos grep para ajudá-lo no mundo real

Publicados: 2021-02-23

O grep, originalmente desenvolvido para sistemas baseados em Unix, é um dos utilitários de linha de comando mais amplamente usados ​​em sistemas Linux.

Seu nome vem de outro comando semelhante na ferramenta ed, ou seja, g / re / p , que significa busca global por uma expressão regular e imprime linhas correspondentes. grep basicamente procura por um determinado padrão ou expressão regular da entrada ou arquivo padrão e imprime as linhas que correspondem aos critérios fornecidos. Geralmente é usado para filtrar detalhes desnecessários ao imprimir apenas as informações necessárias de grandes arquivos de log.

O poder da expressão regular combinado com as opções suportadas no grep torna isso possível.

Aqui, abordaremos alguns dos comandos grep comumente usados ​​em diferentes cenários por administrador de sistema ou desenvolvedor.

Então vamos começar…

sintaxe do comando grep

O comando grep espera um padrão e argumentos opcionais junto com uma lista de arquivos, se usado sem canalização.

 $ grep [options] pattern [files]

Um exemplo simples é:

 $ grep my file.txt my_file $

Procurando vários arquivos

O grep permite que você pesquise o padrão fornecido não apenas em um, mas em vários arquivos. Veja como você pode procurar um padrão em vários arquivos usando * curinga.

 $ sudo grep -i err /var/log/messages*

Resultado:

 $ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $

Você pode observar na saída acima que o nome do arquivo é impresso primeiro antes de imprimir a linha correspondente para indicar onde o grep encontrou o padrão fornecido.

Pesquisa que não diferencia maiúsculas de minúsculas

grep se oferece para pesquisar um padrão sem olhar para o caso do padrão. Use o sinalizador -i para dizer ao grep para ignorar maiúsculas e minúsculas.

 $ grep -i [pattern] [file]

Resultado:

 $ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Pesquisa de palavras inteiras

Nem sempre queremos uma correspondência parcial, mas esperamos que o grep corresponda apenas a uma palavra completa. Você pode fazer isso com o sinalizador -w .

 $ grep -w [pattern] [file]

Resultado:

 $ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $

Verificar Contagem de Partidas

Às vezes, em vez da linha correspondente real, precisamos apenas da contagem de correspondências bem-sucedidas feitas pelo grep. Podemos obter essa contagem usando a opção -c .

 $ grep -c [pattern] [file]

Resultado:

 $ grep -c is text_file.txt 2 $

Pesquisar subdiretórios

Freqüentemente, é necessário pesquisar arquivos não apenas no diretório de trabalho atual, mas também em subdiretórios. grep permite que você faça isso facilmente com -r sinalizador.

 $ grep -r [pattern] *

Resultado:

 $ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $

Como você pode observar, grep percorre cada subdiretório dentro de um diretório atual e lista os arquivos e linhas onde uma correspondência é encontrada.

Pesquisa Inversa

Se você quiser encontrar algo que não corresponda a um determinado padrão, o grep permite fazer exatamente isso com o sinalizador -v .

 $ grep -v [pattern] [file]

Resultado:

 $ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

Você pode comparar a saída do comando grep no mesmo padrão e arquivo com e sem sinalizador -v . Com -v , as linhas que não correspondem ao padrão são impressas.

Números de linha de impressão

grep permite imprimir números de linha junto com linhas impressas, o que facilita saber onde a linha está no arquivo. Use a opção -n conforme mostrado para obter números de linha na saída.

 $ grep -n [pattern] [file]

Resultado:

 $ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $

Limite grep Saída

Para arquivos grandes, como logs, etc., a saída do grep pode ser longa e você pode precisar apenas de um número fixo de linhas na saída, em vez de corresponder a tudo. Podemos usar – m[num] para limitar as linhas impressas por num. Veja como usá-lo:

 $ grep -m[num] [pattern] [file]

Observe como o uso do sinalizador -m afeta a saída do grep para o mesmo conjunto de condições no exemplo abaixo:

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $

Mostrar Linhas Adicionais

Freqüentemente, precisamos não apenas das linhas que têm um padrão correspondente, mas de algumas linhas acima ou abaixo para um melhor contexto.

É possível imprimir uma linha acima ou abaixo (ou ambos) de uma linha com um padrão usando grep usando sinalizadores -A , -B ou -C com valor num . Aqui num denota o número de linhas adicionais a serem impressas logo acima ou abaixo da linha correspondente. Isso se aplica a todas as correspondências encontradas pelo grep no arquivo ou lista de arquivos especificado.

 $ grep -A[num] [pattern] [file]

OU

 $ grep -B[num] [pattern] [file]

OU

 $ grep -C[num] [pattern] [file]

A saída abaixo mostra uma saída grep normal, bem como saída com sinalizador -A , -B e -C um por um. Observe como o grep interpreta os sinalizadores e seus valores e as alterações na respectiva saída. Com o sinalizador -A1 , grep imprime 1 linha que segue logo após a linha correspondente.

Da mesma forma, com o sinalizador -B1 , ele imprime 1 linha antes da linha correspondente. Com o sinalizador -C1 , imprime 1 linha antes e depois da linha correspondente.

 $ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

Listar nomes de arquivos

Para imprimir apenas o nome dos arquivos onde um padrão é encontrado, em vez das linhas realmente correspondentes, use -l sinalizador.

 $ grep -l [pattern] [file]

Aqui está um exemplo de execução:

 $ grep -l su *.txt file.txt text_file.txt $

Imprimir Linhas Exatas

Às vezes, precisamos imprimir linhas que correspondam exatamente a um determinado padrão, não a uma parte dele. grep permite que o sinalizador -x faça exatamente isso.

 $ grep -x [pattern] [file]

No exemplo abaixo, file.txt contém uma linha com apenas uma palavra “suporte” e, como tal, é correspondido por grep com o sinalizador -x enquanto ignora as linhas que podem conter as palavras “suporte” junto com outro texto.

 $ grep -x support *.txt file.txt:support $

Cadeia Inicial de Correspondência

Usando expressões regulares, podemos encontrar uma string no início de uma linha. Veja como fazer isso.

 $ grep [options] "^[string]" [file]

Exemplo:

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $

Observe como o uso do caractere ^ altera a saída. ^ indica o início da string e grep corresponde a ^It como qualquer linha começando com a palavra It . Colocar entre aspas pode ajudar quando o padrão contém espaços, etc.

Correspondência final

Outra expressão regular útil comum é corresponder ao final do padrão de linha.

 $ grep [options] "[string]$" [file]

Exemplo:

 $ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $

Tentamos combinar um arquivo . caractere no final da linha. Como o ponto (.) é um caractere de significado especial, precisamos escapá-lo com o caractere \ . Observe novamente como a saída varia quando apenas combinamos . caractere e quando usamos $ para instruir o grep a corresponder apenas às linhas que terminam com . (não aqueles que podem contê-lo em qualquer lugar no meio).

Usar arquivo de padrão

Pode haver situações em que você tenha uma lista complexa de padrões que usa com frequência. Em vez de anotá-lo todas as vezes, você pode especificar uma lista de padrões em um arquivo e usar com o sinalizador -f . O arquivo deve conter um padrão por linha.

 $ grep -f [pattern_file] [file_to_match]

Em nosso exemplo, criamos nomes de arquivo padrão pattern.txt com o conteúdo abaixo:

 $ cat pattern.txt This It $

Para usá-lo, use -f sinalizador.

 $ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Especificar vários padrões

grep permite especificar vários padrões usando o sinalizador -e .

 $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]

Exemplo:

 $ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Especificar RegEx estendido

O grep também suporta Expressões Regulares Estendidas ou ERE usando o sinalizador -E . Isso é semelhante ao comando egrep no Linux.

O uso de ERE tem uma vantagem quando você deseja tratar os metacaracteres como estão e não deseja substituí-los como strings como grep. Isso lhe dá mais flexibilidade em termos de escapá-los, como somos obrigados a fazer no caso do grep. Dito isto, usar -E com grep é equivalente ao comando egrep .

 $ grep -E '[Extended RegEx]' [file]

Aqui está um uso do ERE onde queremos imprimir linhas que não estão comentadas ou em branco. Isso é especialmente útil para encontrar algo em grandes arquivos de configuração. Além disso, usei o sinalizador -v para NÃO imprimir linhas correspondentes ao padrão '^(#|$)' .

 $ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $

Conclusão

Os exemplos acima são apenas a ponta do iceberg. grep oferece suporte a uma variedade de opções e pode ser uma ferramenta muito útil na mão de uma pessoa que sabe como usá-la efetivamente. Podemos não apenas usar os exemplos dados acima, mas combiná-los de diferentes maneiras para obter o que precisamos.

Consulte sua página de manual para ler mais sobre isso.

 $ man grep

Em seguida, aprenda exemplos de comandos SFTP.