Intereting Posts
Grep, показывающий имя файла и строку, найденную Что такое "openssl binaries" и "openssl development package"? Как не-geek может установить правильный брандмауэр? telegram-cli: Как загружать и показывать изображения? Что делать, если установщик говорит, что у меня недостаточно свободного места на жестком диске? Щелкните правой кнопкой мыши, чтобы открыть терминал в Kubuntu? Как создать сеанс сеанса при запуске с командой, которая не заканчивается, когда команда завершается Я установил только Ubuntu, а не двойную загрузку. Но теперь я не могу найти свои диски Почему я получаю эту ошибку, пытаясь построить Komparator из источника? Сценарий запуска потопа работает, но не запускает демон при запуске Фиксирование конфликтной зависимости Не удается установить Ubuntu на Lenovo z585 В localhost он по-прежнему показывает самую низкую версию, используя Ubuntu lspci и lshw не показывают сетевых устройств Утилита резервного копирования файлов с инкрементными резервными копиями, которые будут содержать резервное устройство

Почему мое 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 .

Что я делаю не так?

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

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

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

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

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

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