grep или другое регулярное выражение для получения значения вывода

458
clarkk

Как использовать grepили любой другой инструмент, чтобы получить определенное значение в выводе

В приведенном ниже выводе мне нужно получить значение 255.00в строке сMinimum: 255.00 (1.0000)

Шаблон как: Channel Statistics:\s+Gray:\s+Minimum: +([\d.]+)

Image: test.tif Format: TIFF (Tagged Image File Format) Geometry: 2525x1785 Class: DirectClass Type: bilevel Depth: 1 bits-per-pixel component Channel Depths: Gray: 1 bits Channel Statistics: Gray: Minimum: 255.00 (1.0000) Maximum: 255.00 (1.0000) Mean: 255.00 (1.0000) Standard Deviation: 0.00 (0.0000) Filesize: 581 Interlace: No Orientation: Unknown Background Color: white Border Color: #DFDFDF Matte Color: #BDBDBD 
0

2 ответа на вопрос

0
Toto

Используя perl, вы можете сделать следующее. Он захватывает числовое значение после minimum:внутри блока Channel Statistics:и печатает его:

perl -0 -ne '/Channel Statistics:\s+Gray:\s+Minimum:\h+([\d.]+)/ && print $1,"\n"' file 

Вывод: (для данного примера)

255.00 

Объяснение:

-0 # specifies the input record separator. If there are no digits, the null character is the separator. The whole file is read in a single string. -n # Iterate over the file -e # execute the command line 

Regex:

/ # regex delimiter Channel Statistics: # literally \s+ # 1 or more any kind of spaces Gray: # literally \s+ # 1 or more any kind of spaces Minimum: # literally \h+ # 1 or more horizontal spaces ( # start group 1 [\d.]+ # 1 or more digit or dot ) # end group / # regex delimiter 
0
xenoid

С sed

sed -rn 's/^\s+Minimum:\s+([0-9.]+).+$/\1/p' image.data 

В замедленном режиме:

  • -rговорит, что sedмы используем расширенное регулярное выражение "синтаксис"
  • -nговорит sedне печатать несовпадающие строки
  • s/^\s+Minimum:\s+([0-9.]+).+$/\1/ соответствует вашей целевой линии и заменяет ее только значением, которое вы после
  • pговорит sedраспечатать результат

Если вам необходимо устранить неоднозначность, принимая во внимание содержание предыдущих строк, это немного сложнее:

sed -r ':a;N;$!ba; s/^.*Gray:\s*\n\s+Minimum:\s+([0-9.]+).+$/\1/' image.data 

где:

  • :a;N;$!ba;это цикл на sedязыке, который загружает весь файл одновременно
  • -n больше не нужно, так как нет других строк, которые мы не хотим печатать
  • финал pбольше не нужен, так как мы не используем-n

Похожие вопросы