grep + regexが機能しないのはなぜですか?


9

最近私は十分で十分だと判断しました-私は流暢にgrepを使用することを学ぶつもりでした。3時間も経ちましたが、私はすでにこのおもちゃの問題に困惑しています。

現在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」正規表現構文を参照してください。
RaduRădeanu2014年

回答:



6
  • シェルがそれを解釈しないように、式を引用する必要があります
  • grep\dエスケープはありません[0-9]。代わりに使用する必要があります。
  • +-Eスイッチなしでエスケープする必要があります。

これはうまくいくはずです:

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

kennの回答を受け入れたのは、この-Pスイッチを使用すると、すでに慣れている方法で正規表現を使用できるためです。それでも素晴らしい解決策なので、私はまだあなたの答えを支持しています。これを覚えておきます!ありがとう!
blz 2014年

3
@blz grepは、「基本」-G(デフォルト)、「拡張」-Eおよび「perl」-Pの3つの「スタイル」の正規表現をサポートしています。基本モードでは、?, +, {, |, (, and )特別な意味を持つようにエスケープする必要があります。
kiri

0

sed代わりに使用してください、これは私のために働きました:

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

OPはgrepの流暢な使い方を学ぶ」ことを
RaduRădeanu2014年

@カオス、セドについて知りませんでした。私はこれについてメンタルなメモを書いています=)
blz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.