Obtenir le numéro de ligne lors de l'utilisation de grep


360

J'utilise grep récursif pour rechercher des fichiers pour une chaîne, et tous les fichiers correspondants et les lignes contenant cette chaîne sont imprimés sur le terminal. Mais est-il possible d'obtenir les numéros de ligne de ces lignes aussi ??

ex: ce que j'obtiens actuellement /var/www/file.php: $options = "this.target", mais ce que j'essaye d'obtenir /var/www/file.php: 1142 $options = "this.target";, eh bien, où 1142serait le numéro de ligne contenant cette chaîne.

La syntaxe que j'utilise pour grep récursivement est sudo grep -r 'pattern' '/var/www/file.php'

Une autre question est de savoir comment obtenir des résultats différents d'un modèle. Comme tous les fichiers mais pas ceux qui ont une certaine chaîne?


L'indicateur -v affichera les lignes qui ne correspondent pas (grep -v myText MyFile.txt)
bcarroll

Réponses:


546
grep -n SEARCHTERM file1 file2 ...

J'avais une autre petite question, comment pouvons-nous obtenir des résultats différents d'un modèle. Comme tous les fichiers mais pas ceux qui ont une certaine chaîne?
sai

5
ce serait le commutateur de ligne de commande -v. Si vous exécutez 'grep --help', il affichera toutes les options
Miro A.

56
Vous n'avez pas besoin -rsi vous spécifiez plusieurs fichiers. Vous n'avez besoin que -rsi vous spécifiez des répertoires.
Sparhawk

@JeanPaul - Je vois le même résultat pour -nr et -n -r. Quelle version de grep utilisez-vous? $ grep -n -r nom * | wc -l 1984 $ grep -nr nom * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD
Miro A.

Code seule réponse, aucune explication. : S
Florian Castelain

148

Les numéros de ligne sont imprimés avec grep -n:

grep -n pattern file.txt

Pour obtenir uniquement le numéro de ligne (sans la ligne correspondante), on peut utiliser cut:

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

Les lignes ne contenant pas de motif sont imprimées avec grep -v:

grep -v pattern file.txt

3
Et dernier numéro de ligne correspondant: grep -n pattern file.txt | cut -d : -f 1 | tail -1(vous pouvez l'enregistrer dans une variable et l'utiliser pour p.ex. le fichier de queue de celui-ci)
Nux

Et pour supprimer le nombre / deux points au début de chaque chaîne, vous pouvez utiliser quelque chose comme:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
leetbacoon

24

Si vous souhaitez uniquement le numéro de ligne, procédez comme suit:

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

Exemple:

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

1
awk -F: '{print $1}'fonctionne également et vous n'avez pas besoin -rde greplorsqu'il est utilisé sur des fichiers (seuls les répertoires peuvent être recherchés récursivement)
Stuart Cardall

7
grep -A20 -B20 pattern file.txt

Rechercher le motif et afficher 20 lignes après et avant le motif


11
Ce n'est pas du tout ce qui était demandé.
Jonathon Reinhart

3
Aussi, -C20est une version plus courte si c'est ce que l'on voulait
Marty Neal

0

grep -nr répertoire "chaîne de recherche"

Cela vous donne la ligne avec le numéro de ligne.


0

Afin d'afficher les résultats avec les numéros de ligne, vous pouvez essayer ceci

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

Le résultat devrait être quelque chose comme ceci:

linenumber: other data "word to search for" other data
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.