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

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

Как использовать 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

решение1

Используя 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 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

решение2

С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

решение3

Это очень упрощенно, если предположить, что строка «Минимум:» встречается во входных данных ровно один раз:

awk '/Minimum:/ {print $2}'

Связанный контент