web-dev-qa-db-fra.com

Comment imprimer le numéro de ligne où une chaîne apparaît dans un fichier?

J'ai un mot spécifique et j'aimerais savoir quel numéro de ligne de mon fichier apparaît Word. 

Cela se passe dans un script c shell.

J'ai essayé de jouer avec awk pour trouver le numéro de ligne, mais je n'ai pas encore réussi à le faire. Je veux aussi affecter ce numéro de ligne à une variable.

9
Taylor

Utiliser grep

Pour rechercher Word dans le fichier et imprimer le numéro de ligne, utilisez l'option -n pour grep:

grep -n 'Word' file

Ceci affiche à la fois le numéro de la ligne et la ligne sur laquelle elle correspond.

Utiliser awk

Ceci imprimera le numéro de ligne sur lequel Word Word apparaît dans le fichier:

awk '/Word/{print NR}' file

Ceci imprimera à la fois le numéro de la ligne et la ligne sur laquelle Word apparaît:

awk '/Word/{print NR, $0}' file

Vous pouvez remplacer Word par toute expression régulière de votre choix.

Comment ça marche:

  • /Word/

    Ceci sélectionne les lignes contenant Word.

  • {print NR}

    Pour les lignes sélectionnées, le numéro de la ligne est imprimé (NR signifie le numéro de l’enregistrement). Vous pouvez modifier ceci pour imprimer les informations qui vous intéressent. Ainsi, {print NR, $0} afficherait le numéro de ligne suivi de la ligne elle-même, $0.

Assigner le numéro de ligne à une variable

Utilisez la substitution de commande:

n=$(awk '/Word/{print NR}' file)

Utilisation de variables shell comme modèle

Supposons que l'expression rationnelle que nous recherchons se trouve dans la variable Shell url:

awk -v x="$url" '$0~x {print NR}' file

Et:

n=$(awk -v x="$url" '$0~x {print NR}' file)
15
John1024

Sed

Vous pouvez utiliser la commande sed

 sed -n '/pattern/=' file

Explication

Le -n supprime la sortie normale afin qu'il n'imprime pas les lignes réelles. Il correspond d'abord au /pattern/, puis l'opérateur = signifie que le numéro de ligne est imprimé. Notez que cela imprimera toutes les lignes contenant le motif.

1
bkmoney

Utiliser la variable NR

Étant donné un fichier contenant:

foo
bar
baz

utilisez la variable intégrée NR pour trouver le numéro de ligne. Par exemple:

$ awk '/bar/ { print NR }' /tmp/foo
2
0
Todd A. Jacobs

trouvez le numéro de ligne pour lequel la première colonne correspond à RRBS

awk 'i++ {if($1~/RRBS/) print i}' ../../bak/bak.db
0
Shicheng Guo