Grep avec des caractères numériques randoms

Je veux grep lignes contenant

- 0 amount - 122,000,000 amount - 50,000 amount 

J'ai essayé d'utiliser

 grep -rhI " - * amount ". 

mais il sortira tout ce qui contient

  - 

peu importe qu'il contienne

 amount 

Le problème est que je ne veux que des strings avec

  - * amount 

* indique quelque chose entre - (here) amount . Il est acceptable que les lignes contenant uniquement "-" soient rejetées.

Mais ça ne marche pas.

Le * correspondra à zéro ou plus du caractère ou du motif précédent .

Cela signifie que - * amount correspondra

  • - amount
  • - amount
  • - amount
  • (etc.)

Pour faire correspondre les nombres, comme vous les avez écrits, utilisez - [0-9,]+ amount comme motif. Le + va forcer au less une correspondance de l'expression régulière précédente, et [0-9,] correspondra à n'importe quel chiffre ou une virgule.

Compte tenu du file suivant:

  - 0 amount - 122,000,000 amount - 50,000 amount - amount - amount - some amount 

Cela fonctionnera:

 $ grep -E -- '- [0-9,]+ amount' file - 0 amount - 122,000,000 amount - 50,000 amount 

Le -E est nécessaire parce que + est une expression régulière étendue, et le -- est nécessaire car sinon le - dans le pattern serait interprété comme une option à grep (double tiret signale la fin des options de la command line).

Vous pouvez également ancrer le motif au début et à la fin de la ligne:

 $ grep -E '^ - [0-9,]+ amount$' file 

Cela signifie que le -- n'est plus nécessaire et veillera à ce que la ligne commence par un espace suivi du tiret et du numéro, etc. comme précédemment. La amount string doit être la dernière chose sur la ligne.

Quelque chose comme peut faire le travail (avec le script awk, searchr le 1er token à être tiret et le 3ème à être la string "montant"):

 awk '$1=="-" && $3=="amount" {print $2}' 

Si vous voulez que la ligne entière soit imprimée, utilisez quelque chose comme:

 awk '$1=="-" && $3=="amount" {print}' 

Vous pourriez aussi utiliser

 grep -rhI -- '- [^ ]* amount' /path/to/parent/dir/* 

[^ ]* correspond à n'importe quel nombre de caractères sauf un espace.