Digamos que ejecuto el comando SayStuff
$ SayStuff
y la salida es
Watermelons and cucumbers
Ahora. Digamos que quiero extraer la subcadena cucumbers
de la salida y canalizarla en algo.
La forma en que haría esto programáticamente sería dividir la salida en una matriz por el delimitador Space y hacer referencia a ella ArrayName[2]
. Soy bastante nuevo en los scripts de shell y solo he logrado desenterrar cut
ejemplos semicrípticos , ninguno de los cuales tenía sentido.
¿Algunas ideas?
linux
command-line
bash
krystah
fuente
fuente
cut
no manejará un número variable de espacios, mientras que loawk
hará.Probablemente usaría una de las opciones que ya ofrece @slhck, pero aquí hay algunas formas más de hacerlo:
Usando matrices, como lo haría en cualquier otro idioma:
El
var=()
declara una matriz,$(command)
guarda la salida del comando. Por lo tanto,foo=( $(SayStuff) )
almacena la salida deSayStuff
en la matrizfoo
y luegoecho
es su tercer elemento con${foo[2]}
.sed
El
sed
comando sustituirá (s///
) todo con la última palabra. La expresión regular coincide con cualquier cosa hasta un espacio (.*
) que coincidirá con todo hasta el último espacio y luego captura la última palabra(\(.*\)
. Como la palabra ha sido capturada, podemos referirnos a ella como\1
.Una versión más simple:
golpetazo
Esto usa las habilidades de manipulación de cadenas de bash, vea aquí para más detalles.
Más bash
Perl, donde, por supuesto, hay muchas maneras de hacer esto:
Las
-a
marcas seperl
comportan comoawk
, dividiendo líneas en espacios en blanco y guardando en la matriz@F
. Luego imprimimos el último elemento de@F
($#F
es el número de elementos en@F
). El-l
le dice a Perl que agregue una nueva línea a cadaprint
instrucción,-n
que debe procesar STDIN línea por línea y-e
que debe ejecutar el script dado en la línea de comando.Las opciones se explicaron anteriormente, simplemente estamos eliminando todo hasta el último espacio e imprimiendo (
-p
).Aquí estamos pasando
Watermelons and cucumbers
como argumentos, que Perl guardará en la@ARG
matriz y, por lo tanto, imprimimos el último elemento de@ARG
.astucia. Este se usa
sed
para convertir espacios en nuevas líneas y luegotail
para imprimir solo la última línea.grep y expresiones regulares, con las
-o
cuales imprime solo la cadena coincidente.engañando
fuente
Aquí hay alguna explicación más:
Entonces, si necesita el tercer campo y está delimitado por espacios '', entonces es
Si desea el campo ÚLTIMO , probablemente debería usar awk .
En este caso se convierte en:
En
awk
NF es el número de campos en la línea, por lo que$NF
significa el último campo en la línea.fuente