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