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/mdstat
ditunjukkan 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 watch
untuk memonitor /proc/mdstat
secara 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?
\d
dan selalu mengutip regex di dalamnyagrep
. Lihat 'grep' sintaks ekspresi reguler .Jawaban:
Jika Anda ingin menggunakan sintaks regex Anda perlu -P beralih dengan grep. Lihat tamu sebelumnya bertanya di sini Apakah sintaks grep berbeda dari regex?
sumber
grep
tidak memiliki jalan\d
keluar, Anda harus menggunakannya[0-9]
sebagai gantinya.+
perlu melarikan diri tanpa-E
saklar.Ini seharusnya bekerja:
sumber
-P
saklar 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!?, +, {, |, (, and )
lolos memiliki makna khusus.Gunakan
sed
sebagai gantinya, ini bekerja untuk saya:sumber