Respuestas:
Suponiendo que lo que realmente quiere decir es que desea eliminar todo hasta el último colon y dejar john.doeintacto:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
La primera línea simplemente canaliza la cadena de prueba sedpara fines de ejemplo.
El segundo es una sedsustitución básica . La parte entre el primero y el segundo /es la expresión regular a buscar y la parte entre el segundo y el tercero es con qué reemplazarla (nada en este caso, ya que estamos eliminando).
Para la expresión regular, .coincide con cualquier carácter, *repite esto cualquier número de veces (incluido cero) y :coincide con dos puntos. Entonces, efectivamente, es cualquier cosa seguida de un colon. Como .*puede incluir dos puntos, la coincidencia es 'codiciosa' y se incluye todo hasta el último punto.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Estoy reemplazando todas las apariciones de : con una pestaña y luego la uso awkpara extraer la cadena john.doe.
Si no tiene un archivo, puede probar esto.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Según los comentarios de Graeme, podemos usar awkpara imprimir la última columna solo usando la NFvariable de la awksiguiente.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Incorporando los comentarios de Graeme para deshacerse de lo innecesario sed
El comando se puede modificar de la siguiente manera.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk. Básicamente, trato de probar los comandos que obtuve originalmente en mi respuesta e intento modificarlos de acuerdo con los requisitos del usuario. :)
-Fopción para awkespecifica el separador de campo. Si le indica awkque use dos puntos, no es necesario reemplazar los dos puntos con pestañas. Además, si desea obtener el último campo que puede usar en $NFlugar de $4, esto funcionaría si no siempre hay 3 puntos.
Otro método usando awk:
awk -F: '{ print $NF }'
Por favor, inténtalo
editar: ancla eliminada
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
y para borrar
echo 'abc:fjk' |sed 's/.*://g'
^ancla no hace ninguna diferencia en el caso de la pregunta o en su caso de ejemplo. Cualquier dirección que comience /.*ya implica el ^.
awk, ¿por qué no simplemente hacerloawk -F:?