Уменьшить вывод Findstr

Я хочу уменьшить вывод следующей строки: for /F "tokens=10" %a in ('c:\Programme\smartmontools\bin\smartctl.exe -a /dev/hdb ^| findstr /BC:" 9" ') do @echo %a

Эта строка извлекает значение Power-On-Hours с жесткого диска или твердотельного накопителя.

Большинство жестких дисков или твердотельных накопителей дают мне правильные часы, например: 3423 или что-то в этом роде. Простое значение.

К сожалению, некоторые твердотельные накопители Kingston имеют следующее значение: 197h+00m+00.000s.

Можно ли уменьшить вывод до 197?

Может быть, с другой трубой findstr?

Команда должна быть в той же строке (!) как-то так: Это не работает, но я надеюсь, что это объясняет, что я имею в виду.

for /F "tokens=10" %a in ('c:\Programme\smartmontools\bin\smartctl.exe -a /dev/hdb ^| findstr  /BC:"  9" | findstr [0-9][0-9]?[0-9]?[0-9]?[0-9]?') do @echo %a

Извините за мой плохой английский!!


person Daniel4711    schedule 24.03.2017    source источник


Ответы (2)


findstr может найти строку, содержащую определенную строку, но не может ее изменить.

Вы можете добавить еще один for, чтобы делать то, что вы хотите:

@for /F "tokens=10" %a in ('@c:\Programme\smartmontools\bin\smartctl.exe -a /dev/hdb ^| findstr  /BC:"  9" ')  do @for /f "delims=h" %b in ("%a") do @echo %b

(не проверено, так как у меня нет этой утилиты)

person Stephan    schedule 24.03.2017
comment
Хорошая работа, спасибо! Но.... я должен поместить эту строку в пользовательский параметр zabbix, и вывод будет выглядеть так: C:\Windows\system32>for /F delims=h %b in (197h+00m+00.000s) do @echo % б 197 . Можно ли подавить вывод строки c:\windows...? - person Daniel4711; 24.03.2017
comment
Мне нужно только 197 - person Daniel4711; 24.03.2017
comment
Идеальный! 12 баллов Стефану! :) - person Daniel4711; 24.03.2017

Похоже, Zabbix не любит второй стек. Так как типичный (укороченный) вывод smartctl выглядит так:

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   120   099   ---    Pre-fail  Always       -       235885189
  3 Spin_Up_Time            0x0023   098   097   ---    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   ---    Old_age   Always       -       442
  5 Reallocated_Sector_Ct   0x0033   100   100   ---    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002f   085   060   ---    Pre-fail  Always       -       347745957
  9 Power_On_Hours          0x0032   075   075   ---    Old_age   Always       -       197h+00m+00.000s

Вы можете изменить первый for /f, чтобы включить букву h в качестве разделителя, так как в этой строке нет другого нижнего регистра h. Так

for /F "tokens=10delims=h " %a in ('c:\Programme\smartmontools\bin\smartctl.exe -a /dev/hdb ^| findstr  /BC:"  9" ') do echo %a

Должен выводиться:

197
person Community    schedule 24.03.2017
comment
это была моя первая мысль, но поскольку я не знал, как будет выглядеть вывод... Лично я бы использовал find "Power_On_Hours" вместо findstr /BC:" 9" - просто для удобства чтения. - person Stephan; 24.03.2017