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.
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.
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
.
Utilisez la substitution de commande:
n=$(awk '/Word/{print NR}' file)
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)
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.
É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
trouvez le numéro de ligne pour lequel la première colonne correspond à RRBS
awk 'i++ {if($1~/RRBS/) print i}' ../../bak/bak.db