¿Sin awk?... Pero es tan simple con awk:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK es una herramienta mucho más poderosa para tener en su bolsillo. -F si para el separador de campoNF es el número de campos (también representa el índice del último)
Podrías intentar algo como esto:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Explicación
rev
invierte "maps.google.com" para que seamoc.elgoog.spam
cut
utiliza un punto (es decir, '.') como delimitador y elige el primer campo, que esmoc
- por último, lo invertimos de nuevo para obtener
com
No es posible usar solo cut
. Aquí hay una forma de usar grep
:
grep -o '[^,]*$'
Reemplace la coma por otros delimitadores.
Explicación:
-o
(--only-matching
) solo genera la parte de la entrada que coincide con el patrón (el valor predeterminado es imprimir la línea completa si contiene una coincidencia).[^,]
es una clase de carácter que coincide con cualquier carácter que no sea una coma.*
coincide con el patrón anterior cero o más veces, por lo que[^,]*
coincide con cero o más caracteres que no sean comas.$
coincide con el final de la cadena.- Juntando esto, el patrón coincide con cero o más caracteres que no sean comas al final de la cadena.
- Cuando hay varias coincidencias posibles,
grep
prefiere el que empieza antes. Entonces todo el último campo coincidirá.
Ejemplo completo:
Si tenemos un archivo llamado data.csv que contiene
one,two,three
foo,bar
entonces grep -o '[^,]*$' < data.csv
saldrá
three
bar
Utilice una expansión de parámetros. Esto es mucho más eficiente que cualquier tipo de comando externo, cut
(o grep
) incluido.
data=foo,bar,baz,qux
last=${data##*,}
Consulte BashFAQ #100 para obtener una introducción a la manipulación de cadenas nativas en bash.