Respuestas:
Suponiendo que lo que realmente quiere decir es que desea eliminar todo hasta el último colon y dejar john.doe
intacto:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
La primera línea simplemente canaliza la cadena de prueba sed
para fines de ejemplo.
El segundo es una sed
sustitució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 awk
para 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 awk
para imprimir la última columna solo usando la NF
variable de la awk
siguiente.
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. :)
-F
opción para awk
especifica el separador de campo. Si le indica awk
que 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 $NF
lugar 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:
?