方法指导:在多个略有不同的分隔符之间点击字符串

时间:2014-05-03 23:37:34

标签: regex bash shell awk sed

假设一个3Kb文件,如下所示:

PdId1 Unit 1
Model 3244
Status: OK
Advanced Status OK
-----------------------
No errors found
Statistics...
...<arbitrary length values here>...
PdId2 Unit 1
Model 3222
Status: OK
Advanced Status OK
-----------------------
Error Log is as follows <arbitrary values here>
PdId3 Unit 1
Model 3243
Status: OK
Advanced Status OK
-----------------------
No errors found

因此我们可以确定PdIdn可以可靠地用作分隔符,它始终位于一行的开头,并且它总是落后于数字。我想在“没有找到错误”的分隔符之间解析文本,如果字符串丢失,请抓住分隔符和接下来的四行(grep -A4),粘贴错误消息并回显结果。

我一直在讨论如何解决这个问题。我最喜欢Bash和grep,但我不认为grep会在这里削减它。我已经看过使用split来将文件分成几部分,但这看起来很麻烦,并且在处理完成后很难清理。我开始尝试在awk / sed中编写一些内容,但我不明白如何拆分分隔符,然后返回并解析每个结果,然后中断 next 并解析它。

我为这个问题的一般性质道歉,但我很难过,可以使用一些指导。

编辑:从技术上讲,PdId不是分隔符,而是下一条记录的开头。记录数是任意的。

编辑:我们现在可以使用真实世界数据:

-------------------------------------------------------------------------------
PdId: 1
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/31 Celsius
Lifetime    Min/Max Temperature:     16/41 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 251) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
No Errors Logged


SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  139   139   054    Pre-fail  Offline  
        -         71
  3 Spin_Up_Time               0x0007  169   169   024    Pre-fail  Always   
        -         245 (Average 204)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         746
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1181
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         751
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         751
194 Temperature_Celsius        0x0002  193   193   000    Old_age   Always   
        -         31 (Lifetime Min/Max 16/41)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         0

-------------------------------------------------------------------------------
PdId: 2
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/31 Celsius
Lifetime    Min/Max Temperature:     16/40 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 246) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
No Errors Logged


SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  139   139   054    Pre-fail  Offline  
        -         72
  3 Spin_Up_Time               0x0007  171   171   024    Pre-fail  Always   
        -         243 (Average 201)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         746
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1181
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         749
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         749
194 Temperature_Celsius        0x0002  193   193   000    Old_age   Always   
        -         31 (Lifetime Min/Max 16/40)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         0

-------------------------------------------------------------------------------
PdId: 3
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/31 Celsius
Lifetime    Min/Max Temperature:     17/40 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 241) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
No Errors Logged


SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  140   140   054    Pre-fail  Offline  
        -         67
  3 Spin_Up_Time               0x0007  170   170   024    Pre-fail  Always   
        -         234 (Average 213)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         748
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1188
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         750
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         750
194 Temperature_Celsius        0x0002  193   193   000    Old_age   Always   
        -         31 (Lifetime Min/Max 17/40)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         0

-------------------------------------------------------------------------------
PdId: 4
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/31 Celsius
Lifetime    Min/Max Temperature:     15/40 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 254) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
ATA Error Count: 165 (device log contains only the most recent five errors)
    CR = Command Register [HEX]
    FR = Features Register [HEX]
    SC = Sector Count Register [HEX]
    SN = Sector Number Register [HEX]
    CL = Cylinder Low Register [HEX]
    CH = Cylinder High Register [HEX]
    DH = Device/Head Register [HEX]
    DC = Device Command Register [HEX]
    ER = Error register [HEX]
    ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 165 occurred at disk power-on lifetime: 1176 hours (49 days + 0 hours)
  When the command that caused the error occurred,
  the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 50 b0 ee 81 0d

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 80 a8 80 ee 81 40 00      18:38:48.276  WRITE FPDMA QUEUED
  61 80 a0 00 ee 81 40 00      18:38:48.276  WRITE FPDMA QUEUED
  61 80 98 80 ed 81 40 00      18:38:48.276  WRITE FPDMA QUEUED
  61 80 90 00 ed 81 40 00      18:38:48.276  WRITE FPDMA QUEUED
  61 80 88 80 ec 81 40 00      18:38:48.275  WRITE FPDMA QUEUED

Error 164 occurred at disk power-on lifetime: 1175 hours (48 days + 23 hours)
  When the command that caused the error occurred,
  the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 10 f0 ad 6b 0d  Error: ICRC, ABRT 16 sectors at LBA = 0x0d6badf0 = 225160688

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 80 ad 6b 40 00      18:36:07.145  WRITE DMA EXT
  35 00 80 00 ae 6b 40 00      18:36:07.144  WRITE DMA EXT
  35 00 80 00 ad 6b 40 00      18:36:07.144  WRITE DMA EXT
  35 00 80 80 ab 6b 40 00      18:36:07.139  WRITE DMA EXT
  35 00 80 00 ab 6b 40 00      18:36:07.139  WRITE DMA EXT

Error 163 occurred at disk power-on lifetime: 1175 hours (48 days + 23 hours)
  When the command that caused the error occurred,
  the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 f0 10 5e 5d 0d  Error: ICRC, ABRT 240 sectors at LBA = 0x0d5d5e10 = 224222736

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 80 5b 5d 40 00      18:35:47.982  WRITE DMA EXT
  35 00 80 80 5a 5d 40 00      18:35:47.982  WRITE DMA EXT
  35 00 80 00 59 5d 40 00      18:35:47.981  WRITE DMA EXT
  35 00 00 00 58 5d 40 00      18:35:47.979  WRITE DMA EXT
  35 00 30 00 36 5d 40 00      18:35:47.960  WRITE DMA EXT

Error 162 occurred at disk power-on lifetime: 1175 hours (48 days + 23 hours)
  When the command that caused the error occurred,
  the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 20 e0 33 19 0d

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 80 30 00 33 19 40 00      18:34:50.672  WRITE FPDMA QUEUED
  61 80 28 80 33 19 40 00      18:34:50.671  WRITE FPDMA QUEUED
  61 80 20 00 34 19 40 00      18:34:50.671  WRITE FPDMA QUEUED
  61 00 18 80 34 19 40 00      18:34:50.671  WRITE FPDMA QUEUED
  61 80 10 80 36 19 40 00      18:34:50.670  WRITE FPDMA QUEUED

Error 161 occurred at disk power-on lifetime: 1133 hours (47 days + 5 hours)
  When the command that caused the error occurred,
  the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 d0 30 dd 3b 0a

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 80 38 80 dc 3b 40 00      06:26:51.414  WRITE FPDMA QUEUED
  61 80 30 00 df 3b 40 00      06:26:51.413  WRITE FPDMA QUEUED
  61 80 28 80 df 3b 40 00      06:26:51.413  WRITE FPDMA QUEUED
  61 80 20 00 da 3b 40 00      06:26:51.402  WRITE FPDMA QUEUED
  61 80 18 80 da 3b 40 00      06:26:51.402  WRITE FPDMA QUEUED



SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  139   139   054    Pre-fail  Offline  
        -         73
  3 Spin_Up_Time               0x0007  170   170   024    Pre-fail  Always   
        -         234 (Average 212)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         747
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1187
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         748
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         748
194 Temperature_Celsius        0x0002  200   200   000    Old_age   Always   
        -         30 (Lifetime Min/Max 15/40)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         165

-------------------------------------------------------------------------------
PdId: 5
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/31 Celsius
Lifetime    Min/Max Temperature:     17/40 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 251) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
No Errors Logged


SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  140   140   054    Pre-fail  Offline  
        -         68
  3 Spin_Up_Time               0x0007  133   133   024    Pre-fail  Always   
        -         289 (Average 282)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         748
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1186
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         750
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         750
194 Temperature_Celsius        0x0002  193   193   000    Old_age   Always   
        -         31 (Lifetime Min/Max 17/40)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         0

-------------------------------------------------------------------------------
PdId: 6
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    30 Celsius
Power Cycle Min/Max Temperature:     27/30 Celsius
Lifetime    Min/Max Temperature:     17/40 Celsius
Under/Over Temperature Limit Count:   0/0
Self-test execution status:      (   0) The previous self-test routine
                    completed without error or no self-test
                    has ever been run.
has ever been run.
Error logging capability:        (0x01) Error logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 243) minutes.
SCT capabilities:          (0x003d) SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Self-test log structure revision number: 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Error Log Version: 1
No Errors Logged


SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
==============================================================================
ID# ATTRIBUTE_NAME             FLAG    VALUE WORST THRESH TYPE      UPDATED
    WHEN_FAILED  RAW_VALUE
==============================================================================
  1 Raw_Read_Error_Rate        0x000b  100   100   016    Pre-fail  Always   
        -         0
  2 Throughput_Performance     0x0005  139   139   054    Pre-fail  Offline  
        -         72
  3 Spin_Up_Time               0x0007  130   130   024    Pre-fail  Always   
        -         294 (Average 287)
  4 Start_Stop_Count           0x0012  100   100   000    Old_age   Always   
        -         748
  5 Reallocated_Sector_Ct      0x0033  100   100   005    Pre-fail  Always   
        -         0
  7 Seek_Error_Rate            0x000b  100   100   067    Pre-fail  Always   
        -         0
  8 Seek_Time_Performance      0x0005  124   124   020    Pre-fail  Offline  
        -         33
  9 Power_On_Hours             0x0012  100   100   000    Old_age   Always   
        -         1186
 10 Spin_Retry_Count           0x0013  100   100   060    Pre-fail  Always   
        -         0
 12 Power_Cycle_Count          0x0032  100   100   000    Old_age   Always   
        -         529
192 Power-Off_Retract_Count    0x0032  100   100   000    Old_age   Always   
        -         751
193 Load_Cycle_Count           0x0012  100   100   000    Old_age   Always   
        -         751
194 Temperature_Celsius        0x0002  200   200   000    Old_age   Always   
        -         30 (Lifetime Min/Max 17/40)
196 Reallocated_Event_Count    0x0032  100   100   000    Old_age   Always   
        -         0
197 Current_Pending_Sector     0x0022  100   100   000    Old_age   Always   
        -         0
198 Offline_Uncorrectable      0x0008  100   100   000    Old_age   Offline  
        -         0
199 UDMA_CRC_Error_Count       0x000a  200   200   000    Old_age   Always   
        -         0

2 个答案:

答案 0 :(得分:0)

逐行读取,将所需的行收集到累加器中,当看到触发消息时打印累积的行(否则只需重新开始并在看到下一条记录的开头时覆盖累加器)。

我们使用a作为累加器,使用辅助变量n来跟踪要累积的行数:

awk '/^PdId: [1-9][0-9]*/ { a=$0; n=4; next }
    n { --n; a=a "\n" $ 0; next }
    /No Errors Logged/ { print a }' file

答案 1 :(得分:0)

将以下内容放入可执行的awk文件中:

#!/usr/bin/awk -f

BEGIN {no_errs=1}

c > 0 {a[c++]=$0}

/^----------/ {
    logAnyErrors()
    ata_err=""
    no_errs=0
    c=1 
    delete a
}   

/^No Errors Logged/ {no_errs=1}
/^ATA Error Count:/ {ata_err=$0}

function logAnyErrors() {
    if( ata_err!="" || !no_errs) {
        for(i=1;i<=5;i++) print a[i]
        if( ata_err!="" ) print ata_err
        print "--" # separator
    }
}

END { logAnyErrors() }

您的数据实际上在每个PdId之前都有&#34; ^ ------------------&#34; ...的分隔符。

细分:

  • 假设BEGIN块中没有错误
  • 将每个记录行添加到名为a的数组中,并使用行计数器c
  • 每当新记录部分发生时,请致电logAnyErrors()并重置计数器
  • logAnyErrors()中,如果存在ATA或其他错误,请打印记录的前5行和分隔符,类似于我认为grep -A4的输出。
  • 最后,记录最终记录中的任何错误。

当我将其放入名为awko的可执行文件并运行awko data时,我得到以下输出:

PdId: 4
Model Number: WD 1000
Drive Type: SATA
SMART Status: Enable
SMART Health Status: OK
ATA Error Count: 165 (device log contains only the most recent five errors)
----------------

对于某些问题,delete a行可能不符合要求。适用于我的Mac。除非您希望在发生错误时在每个块中打印出更多信息(因为前5行将始终被覆盖),所以没有必要。