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

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

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

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

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

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

8
задан 05.05.2020, 11:25

2 ответа

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

17
ответ дан 05.05.2020, 11:26
  • 1
    Большой ответ - краткий, точный, и с дополнительными ссылками для начальной загрузки!Спасибо! – jwerre 05.05.2020, 11:26
  • Вы должны заключить в кавычки свое выражение, чтобы оболочка не интерпретировала его
  • grep не имеет escape \d, вместо этого вам нужно будет использовать [0-9].
  • + необходимо экранировать без переключателя -E.

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

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
6
ответ дан 05.05.2020, 11:27
  • 1
    @blz grep поддерживает 3 ' styles' из регулярных выражений: " basic"-G (значение по умолчанию), " extended"-E и " perl"-P. Основной режим требует, чтобы ?, +, {, |, (, and ) были оставлены для имения особого значения. – marcus hall 05.05.2020, 11:27
  • 2
    Я принял kenn' s отвечают, потому что эти -P переключатель позволит мне использовать regexes способом это I' m уже довольно довольный. I' m все еще upvoting Ваш ответ, тем не менее, потому что it' s хорошее решение. I' ll имеют это в виду! Спасибо! – nwalton 05.05.2020, 11:27

Теги

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