我最近决定够了——我要学会熟练使用 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
监控,将它的输出导入 grep,并只显示估计的剩余时间。/proc/mdstat
我的方法如下:
watch cat /proc/mdstat | grep finish=\d+\.\d | grep \d+\.\d
我很困惑为什么这没有产生任何输出。事实上,第一个 grep 表达式没有产生任何输出,尽管它似乎可以工作Regex101。
我究竟做错了什么?
答案1
如果您想使用 Perl 正则表达式语法,则需要-P
切换到 grep。在此处查看之前提出的问题grep 语法与正则表达式不同吗?
答案2
- 你应该引用你的表达式,这样 shell 就不会解释它
grep
没有\d
逃脱,你需要使用[0-9]
。+
需要在没有-E
开关的情况下进行转义。
这应该有效:
watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
答案3
sed
相反,这对我有用:
watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"