Mengapa grep + regex saya tidak berfungsi?

9

Baru-baru ini saya memutuskan bahwa cukup sudah cukup - saya akan belajar menggunakan grep dengan lancar. Sudah tiga jam dan aku sudah bingung dengan masalah mainan ini.

Saat ini saya sedang menyinkronkan array RAID5, yang perkembangannya dapat dimonitor dengan membaca /proc/mdstat. Output cat /proc/mdstatditunjukkan di bawah ini.

$ 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>

Untuk bersenang-senang, saya pikir saya akan gunakan watchuntuk memonitor /proc/mdstatsecara real time, menyalurkan output ke grep, dan hanya menunjukkan perkiraan waktu yang tersisa.

Pendekatan saya adalah sebagai berikut:

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

Saya bingung mengapa ini tidak menghasilkan output. Bahkan, ekspresi grep pertama tidak menghasilkan output, meskipun tampaknya berfungsi pada Regex101 .

Apa yang saya lakukan salah?

blz
sumber
Anda tidak dapat menggunakan \ddan selalu mengutip regex di dalamnya grep. Lihat 'grep' sintaks ekspresi reguler .
Radu Rădeanu

Jawaban:

19

Jika Anda ingin menggunakan sintaks regex Anda perlu -P beralih dengan grep. Lihat tamu sebelumnya bertanya di sini Apakah sintaks grep berbeda dari regex?

kenn
sumber
Jawaban yang bagus - ringkas, akurat, dan dengan referensi tambahan untuk boot! Terima kasih!
blz
6
  • Anda harus mengutip ekspresi Anda sehingga shell tidak menafsirkannya
  • greptidak memiliki jalan \dkeluar, Anda harus menggunakannya [0-9]sebagai gantinya.
  • +perlu melarikan diri tanpa -Esaklar.

Ini seharusnya bekerja:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
kiri
sumber
Saya menerima jawaban kenn karena -Psaklar akan memungkinkan saya untuk menggunakan regex dengan cara yang sudah cukup nyaman bagi saya. Saya tetap memilih jawaban Anda, karena itu solusi yang bagus. Saya akan mengingat ini! Terima kasih!
blz
3
@blz Grep mendukung 3 'gaya' dari ekspresi reguler: "basic" -G (default), "extended" -E dan "perl" -P. Mode dasar mengharuskan yang ?, +, {, |, (, and )lolos memiliki makna khusus.
kiri
0

Gunakan sedsebagai gantinya, ini bekerja untuk saya:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"
kekacauan
sumber
OP ingin "belajar menggunakan grep dengan lancar."
Radu Rădeanu
@chaos, Tidak tahu tentang sed. Saya membuat catatan mental tentang ini =)
blz