Почему мой grep + regex не работает?


10

Недавно я решил, что достаточно - достаточно научиться свободно использовать grep. Прошло всего три часа, и я уже озадачен этой игрушечной проблемой.

В настоящее время я синхронизирую массив RAID5, за ходом которого можно следить по чтению /proc/mdstat. Результат cat /proc/mdstatпоказан ниже.

$ 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>

Для развлечения я подумал, что буду использовать watchдля мониторинга /proc/mdstatв режиме реального времени, передачи его вывода в grep и отображения только приблизительного оставшегося времени.

Мой подход заключается в следующем:

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

Я озадачен тем, почему это не принесло результата. На самом деле, первое выражение grep не производит вывода, даже если кажется, что оно работает на Regex101 .

Что я делаю неправильно?


Вы не можете использовать \dи всегда указывать регулярное выражение внутри grep. Смотрите синтаксис регулярных выражений 'grep' .
Раду Радеану

Ответы:


20

Если вы хотите использовать синтаксис регулярных выражений, вам нужен ключ -P с grep. Ознакомьтесь с ранее заданным вопросом: отличается ли синтаксис grep от регулярных выражений?


Отличный ответ - краткий, точный и с дополнительными ссылками на загрузку! Спасибо!
Blz

6
  • Вы должны процитировать свое выражение, чтобы оболочка не интерпретировала его
  • grepнет \dвыхода, вам нужно использовать [0-9]вместо этого.
  • +необходимо экранировать без -Eвыключателя.

Это должно работать:

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

Я принял ответ Кенна, потому что этот -Pпереключатель позволит мне использовать регулярные выражения так, как мне уже удобно. Я все еще поддерживаю ваш ответ, потому что это хорошее решение. Я буду иметь это в виду! Спасибо!
Blz

3
@blz grep поддерживает 3 «стиля» регулярных выражений: «basic» -G (по умолчанию), «extended» -E и «perl» -P. Основной режим требует, ?, +, {, |, (, and )чтобы экранирование имело особое значение.
Кири

0

Используйте sedвместо этого, это работает для меня:

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

ОП хочет «научиться бегло использовать grep ».
Раду Радеану

@chaos, не знал о седе. Я мысленно отмечаю это =)
blz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.