Pourquoi mon grep + regex ne fonctionne pas?


9

J'ai récemment décidé que ça suffisait - j'allais apprendre à utiliser couramment grep. Cela fait trois heures et je suis déjà déconcerté par ce problème de jouet.

Je synchronise actuellement une matrice RAID5, dont la progression peut être surveillée en lisant /proc/mdstat. La sortie de cat /proc/mdstatest illustrée ci-dessous.

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid5 sda4[0] sdb4[1] sdc4[2]
      5858765824 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=============>.......]  resync = 67.3% (1972073120/2929382912) finish=205.7min speed=77537K/sec

md0 : active raid5 sda3[0] sdb3[1] sdc3[2]
      998400 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

Pour le plaisir, je pensais que j'utiliserais watchpour surveiller /proc/mdstaten temps réel, diriger sa sortie vers grep et n'afficher que le temps restant estimé.

Mon approche est la suivante:

watch cat /proc/mdstat | grep finish=\d+\.\d | grep \d+\.\d

Je suis perplexe quant à la raison pour laquelle cela n'a produit aucune sortie. En fait, la première expression grep ne produit aucune sortie, même si elle semble fonctionner sur Regex101 .

Qu'est-ce que je fais mal?


Vous ne pouvez pas utiliser \det toujours citer une expression régulière à l'intérieur grep. Voir la syntaxe d'expression régulière 'grep' .
Radu Rădeanu

Réponses:


19

Si vous souhaitez utiliser la syntaxe regex, vous avez besoin de l'option -P avec grep. Consultez la question précédemment posée ici La syntaxe de grep est-elle différente de regex?


Excellente réponse - concise, précise et avec des références supplémentaires pour démarrer! Je vous remercie!
blz

6
  • Vous devez citer votre expression pour que le shell ne l'interprète pas
  • grepn'a pas l' \déchappatoire, vous devrez utiliser à la [0-9]place.
  • +doit être échappé sans l' -Einterrupteur.

Cela devrait fonctionner:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'

J'ai accepté la réponse de kenn parce que le -Pcommutateur me permettra d'utiliser des expressions rationnelles d'une manière avec laquelle je suis déjà assez à l'aise. Je vote toujours votre réponse, car c'est une bonne solution. Je garderai cela à l'esprit! Merci!
blz

3
@blz Le grep prend en charge 3 «styles» d'expressions régulières: «basique» -G (par défaut), «étendu» -E et «perl» -P. Le mode de base nécessite que ?, +, {, |, (, and )l'échappement ait une signification spéciale.
kiri

0

Utilisez sedplutôt, cela a fonctionné pour moi:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"

L'OP veut «apprendre à utiliser couramment grep ».
Radu Rădeanu

@chaos, ne connaissait pas sed. J'en note mentalement =)
blz
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.