Obter o número da linha enquanto usa grep


360

Estou usando grep recursive para pesquisar arquivos por uma string, e todos os arquivos correspondentes e as linhas que contêm essa string são impressos no terminal. Mas é possível obter os números dessas linhas também?

ex: atualmente o que recebo é /var/www/file.php: $options = "this.target", mas o que estou tentando obter é /var/www/file.php: 1142 $options = "this.target";, bem, onde1142 estaria o número da linha que contém essa string.

A sintaxe que estou usando para grep recursivamente é sudo grep -r 'pattern' '/var/www/file.php'

Mais uma pergunta é: como obtemos resultados diferentes de um padrão. Como todos os arquivos, mas não os que têm uma determinada string?


A bandeira -v irá mostrar as linhas que não correspondem (grep -v myText MyFile.txt)
bcarroll

Respostas:


546
grep -n SEARCHTERM file1 file2 ...

Eu tive outra pergunta rápida: como obtemos resultados diferentes de um padrão. Como todos os arquivos, mas não os que têm uma determinada string?
Sai

5
isso seria a opção de linha de comando -v. Se você executar 'grep --help', ele exibirá todas as opções
Miro A.

56
Você não precisa -rse especificar vários arquivos. Você só precisa -rse especificar diretórios.
Sparhawk

@ JeanPaul - Eu vejo o mesmo resultado para ambos -nr e -n -r. Qual versão do grep você está usando? $ grep -n -r nome * | wc -l 1984 $ grep -nr nome * | wc-l 1984 $ grep -V grep (grep BSD) 2.5.1-FreeBSD
Miro A.

Código apenas resposta, sem explicação. : S
Florian Castelain

148

Os números de linha são impressos com grep -n:

grep -n pattern file.txt

Para obter apenas o número da linha (sem a linha correspondente), pode-se usar cut :

grep -n pattern file.txt | cut -d : -f 1

As linhas que não contêm um padrão são impressas com grep -v:

grep -v pattern file.txt

3
Eo número da linha última Coincidindo: grep -n pattern file.txt | cut -d : -f 1 | tail -1(você pode salvar este a uma variável e usá-lo para, por exemplo arquivo cauda dela)
Nux

E para remover o número / dois pontos no início de cada string, você pode usar algo como:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
leetbacoon

24

Se você deseja apenas o número da linha, faça o seguinte:

grep -nr Pattern file.ext | gawk '{print $1}' FS=":"

Exemplo:

$ grep -nr 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023

11
awk -F: '{print $1}'também trabalha e você não precisa -rem grepquando usado em arquivos (apenas os diretórios podem ser pesquisados de forma recursiva)
Stuart Cardall

7
grep -A20 -B20 pattern file.txt

Pesquise o padrão e mostre 20 linhas após e antes do padrão


11
Isso não é o que foi solicitado.
Jonathon Reinhart

3
Além disso, -C20é uma versão mais curta, se é isso o que se queria
Marty Neal

0

Diretório grep -nr "search string"

Isso fornece a linha com o número da linha.


0

Para exibir os resultados com os números de linha, você pode tentar isso

grep -nr "word to search for" /path/to/file/file 

O resultado deve ser algo como isto:

linenumber: other data "word to search for" other data
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.