Digamos que ejecuto el comando SayStuff
$ SayStuff
y la salida es
Watermelons and cucumbers
Ahora. Digamos que quiero extraer la subcadena cucumbersde 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 cutejemplos semicrípticos , ninguno de los cuales tenía sentido.
¿Algunas ideas?
linux
command-line
bash
krystah
fuente
fuente

cutno manejará un número variable de espacios, mientras que loawkhará.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 deSayStuffen la matrizfooy luegoechoes su tercer elemento con${foo[2]}.sedEl
sedcomando 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
-amarcas seperlcomportan comoawk, dividiendo líneas en espacios en blanco y guardando en la matriz@F. Luego imprimimos el último elemento de@F($#Fes el número de elementos en@F). El-lle dice a Perl que agregue una nueva línea a cadaprintinstrucción,-nque debe procesar STDIN línea por línea y-eque 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 cucumberscomo argumentos, que Perl guardará en la@ARGmatriz y, por lo tanto, imprimimos el último elemento de@ARG.astucia. Este se usa
sedpara convertir espacios en nuevas líneas y luegotailpara imprimir solo la última línea.grep y expresiones regulares, con las
-ocuales 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
awkNF es el número de campos en la línea, por lo que$NFsignifica el último campo en la línea.fuente