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?


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

Jawaban:



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]'

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'"

OP ingin "belajar menggunakan grep dengan lancar."
Radu Rădeanu

@chaos, Tidak tahu tentang sed. Saya membuat catatan mental tentang ini =)
blz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.