Tengo la cadena “[1] 23043” y quiero extraer el número “23043”, ¿cómo hago eso con grep / awk / sed?

echo "[1] 23043" | sed -E 's/^\[[0-9]+\] +([0-9]+)/\1/'
Es decir,

  • -E habilita expresiones regulares “modernas” en OS X, especialmente usando + para indicar una o más de las expresiones anteriores. Es posible que necesite -r para GNU sed (normalmente se encuentra en Linux).
  • La expresión general de sed en uso es s/a/b/ que son líneas “sustitutas” que coinciden con a con b. El patrón a aquí es:
  • ^ para anclar al comienzo de la línea;
  • \[ para que coincida con un corchete abierto;
  • [0-9]+ para coincidir con uno o más números;
  • + para que coincida con uno o más espacios;
  • ([0-9]+) para capturar uno o más números.
  • El patrón b usa \1 para hacer referencia a la primera expresión capturada, a saber, el segundo conjunto de números.

Siendo * IX, hay muchas maneras de desollar al gato. Los ejemplos que se muestran aquí usan sed, también puede usar la opción -o para extraer solo esa cadena usando grep. En su ejemplo anterior, puede hacer coincidir dígitos consecutivos al final de la línea de esta manera:

grep -o “[0-9] [0-9] * $”

Sería aún más simple usar los parámetros posicionales para extraer la información de que tiene un número fijo de campos separados por espacios en blanco.

Puede usar awk para manipular columnas de texto para que sea tan fácil como:

echo "[1] 23043" | awk '{print $2}'

Sin embargo, también me gustaría ver una solución de expresiones regulares.

Eliminar todo hasta el primer espacio:

echo "[1] 23043" | sed 's/.* //'

… pero probablemente deberías usar awk.