grep u otra expresión regular para obtener el valor de la salida

grep u otra expresión regular para obtener el valor de la salida

Cómo utilizar grepcualquier otra herramienta para obtener un valor específico en una salida

En el siguiente resultado necesito obtener el valor 255.00en la línea conMinimum: 255.00 (1.0000)

Un patrón como: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

Respuesta1

Usando Perl, puedes hacer lo siguiente. Captura el valor numérico después minimum:del interior del bloque Channel Statistics:y lo imprime:

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

Producción:(para el ejemplo dado)

255.00

Explicación:

-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

expresión regular:

/                           # 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

Respuesta2

Consed

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

En cámara lenta:

  • -rdice sedque usemos la "sintaxis" de expresión regular extendida
  • -nle dice sedque no imprima líneas que no coincidan
  • s/^\s+Minimum:\s+([0-9.]+).+$/\1/coincide con su línea objetivo y la reemplaza solo con el valor que busca
  • ple dice sedque imprima el resultado

Si necesita eliminar la ambigüedad teniendo en cuenta el contenido de las líneas anteriores, es un poco más complicado:

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

dónde:

  • :a;N;$!ba;es un bucle en el sedidioma que carga todo el archivo a la vez
  • -nYa no es necesario ya que no hay otras líneas que no queramos imprimir.
  • el final ptampoco es necesario ya que no usamos-n

Respuesta3

Esto es muy simplista, suponiendo que la cadena 'Mínimo:' aparece exactamente una vez en su entrada:

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

información relacionada