$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
El -d ' ' le dice a cut dividir en espacios. -f 3 selecciona la tercera columna.
También puedes usar awk , que ya realiza la división en función del espacio y hace que las columnas estén disponibles como $1 , $2 , …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
Probablemente usaría una de las opciones ya proporcionadas por @slhck, pero aquí hay algunas formas más de hacerlo:
-
Usando matrices, como lo haría en cualquier otro idioma:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbersEl
var=()declara una matriz,$(command)guarda la salida del comando. Entonces,foo=( $(SayStuff) )almacena la salida deSayStuffen la matrizfooy tú entoncesechoes el tercer elemento con${foo[2]}. -
sed$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbersEl
sedel comando sustituirá (s///) todo con la última palabra. La expresión regular coincide con cualquier cosa hasta un espacio (.*) que hará coincidir todo hasta el último espacio y luego capturará la última palabra(\(.*\). Dado que la palabra ha sido capturada, podemos referirnos a ella como\1.Una versión más simple:
$ SayStuff | sed 's/.* //' cucumbers -
golpe
$ foo=$(SayStuff); echo ${foo##* } cucumbersEsto usa las habilidades de manipulación de cadenas de bash, mira aquí para más detalles.
-
Más fiesta
$ SayStuff | while read a b c; do echo $c; done cucumbers -
Perl, donde, por supuesto, hay muchas formas de hacerlo:
$ SayStuff | perl -lane 'print $F[$#F]' cucumberEl
-ahaceperlcomportarse 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 cadaprintdeclaración, el-nque debe procesar STDIN línea por línea y-eque debe ejecutar el script dado en la línea de comando.$ SayStuff | perl -pe 's/.* //' cucumberLas opciones se explicaron anteriormente, solo estamos eliminando todo hasta el último espacio e imprimiendo (
-p).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbersAquí estamos pasando
Watermelons and cucumberscomo argumentos, que perl guardará en el@ARGmatriz y así, imprimimos el último elemento de@ARG. -
astucia. Este usa
sedpara convertir espacios en saltos de línea y luegotailpara imprimir solo la última línea.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers -
grep y expresiones regulares, usando
-oque imprime solo la cadena coincidente.$ SayStuff | grep -Po '\w+$' cucumbers -
hacer trampa
$ SayStuff | grep -o cucumbers cucumbers
Aquí hay más explicaciones:
Usage: cut OPTION... [FILE]...
Print selected parts of lines from each FILE to standard output.
-d, --delimiter=DELIM
use DELIM instead of TAB for field delimiter
-f, --fields=LIST
select only these fields; also print any line that contains no
delimiter character, unless the -s option is specified
Entonces, si necesita el tercer campo y está delimitado por espacios ' ', entonces es
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Si quieres el ÚLTIMO campo que probablemente debería usar awk .
En este caso se convierte en:
$ echo "Sandías y pepinos" | awk '{imprimir $NF}'
pepinos
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.