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

Я недавно решил, что хватит - собирался учиться использовать 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.

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

8
задан 18 January 2014 в 01:19

3 ответа

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

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

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

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
0
ответ дан 18 January 2014 в 01:19

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

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"
0
ответ дан 18 January 2014 в 01:19
  • 1
    I' ve всегда задавался вопросом, почему find -exec требует {} быть последним аргументом, когда используется с +. Любой знает, почему то проектное решение было сделано, вместо того, чтобы позволить конструкциям как OP' s работа командной строки? – Peter Cordes 9 July 2015 в 06:05

Другие вопросы по тегам:

Похожие вопросы: