ทำไม grep + regex ของฉันไม่ทำงาน


10

ฉันเพิ่งตัดสินใจว่าเพียงพอก็พอ - ฉันจะเรียนรู้การใช้ 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ในการตรวจสอบ/proc/mdstatแบบเรียลไทม์ไปป์เอาท์พุทเป็น grep และแสดงเฉพาะเวลาที่เหลือโดยประมาณ

แนวทางของฉันมีดังนี้:

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

ฉันนิ่งงันว่าทำไมสิ่งนี้จึงไม่สร้างผลลัพธ์ ในความเป็นจริงการแสดงออก grep แรกที่ผลิตออกไม่มีแม้ว่ามันจะดูเหมือนว่าจะทำงานในRegex101

ผมทำอะไรผิดหรือเปล่า?


คุณไม่สามารถใช้\dและอ้างถึง regex ภายในgrepเสมอ ดู'grep' ไวยากรณ์แสดงออกปกติ
Radu Rădeanu

คำตอบ:


20

หากคุณต้องการใช้ไวยากรณ์ regex คุณต้องใช้ -P สลับกับ grep ตรวจสอบ guestion ถามก่อนหน้านี้ที่นี่ grep ไวยากรณ์แตกต่างจาก regex?


คำตอบที่ดี - กระชับถูกต้องและมีการอ้างอิงเพิ่มเติมเพื่อบูต! ขอบคุณ!
blz

6
  • คุณควรอ้างอิงนิพจน์ของคุณเพื่อที่เชลล์จะไม่ตีความมัน
  • grepไม่มีทาง\dหนีคุณจะต้องใช้[0-9]แทน
  • +ต้องหลบหนีโดยไม่ใช้-Eสวิตช์

สิ่งนี้น่าจะใช้ได้:

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

ฉันยอมรับคำตอบของ kenn เพราะ-Pสวิตช์จะอนุญาตให้ฉันใช้ regexes ในแบบที่ฉันคุ้นเคยแล้ว ฉันยังคงถอนคำตอบของคุณเพราะมันเป็นทางออกที่ดี ฉันจะเก็บเรื่องนี้ไว้ในใจ! ขอบคุณ!
blz

3
@blz grep รองรับ 3 'สไตล์' ของนิพจน์ทั่วไป: "พื้นฐาน" -G (ค่าเริ่มต้น), "ขยาย" -E และ "perl" -P โหมดพื้นฐานจำเป็นต้อง?, +, {, |, (, and )มีการหลบหนีเพื่อให้มีความหมายพิเศษ
kiri

0

ใช้sedแทนนี่ได้ผลกับฉัน:

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

OP ต้องการ"เรียนรู้การใช้grepอย่างคล่องแคล่ว"
Radu Rădeanu

@chaos ไม่รู้เรื่อง sed ฉันกำลังจดบันทึกเรื่องนี้ =)
blz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.