Digamos que eu execute o comando SayStuff
$ SayStuff
e a saída é
Watermelons and cucumbers
Agora. Digamos que eu queira extrair a substring cucumbers
da saída e canalizá-la em algo.
A maneira como eu faria isso programaticamente seria dividir a saída em uma matriz pelo delimitador Space e referenciá-la ArrayName[2]
. Sou bastante novo no shell scripts e só consegui descobrir cut
exemplos semi-criptográficos , nenhum dos quais fazia sentido.
Alguma ideia?
linux
command-line
bash
Krystah
fonte
fonte
cut
não manipulará um número variável de espaços, enquanto oawk
faz.Eu provavelmente usaria uma das opções já fornecidas pelo @slhck, mas aqui estão mais algumas maneiras de fazer isso:
Usando matrizes, como faria em qualquer outro idioma:
O
var=()
declara uma matriz,$(command)
salva a saída do comando. Então,foo=( $(SayStuff) )
armazena a saída deSayStuff
dentro da matrizfoo
e vocêecho
é o terceiro elemento${foo[2]}
.sed
O
sed
comando substituirá (s///
) tudo pela última palavra. A regex corresponde a qualquer espaço (.*
) que corresponda a tudo até o último espaço e, em seguida, captura a última palavra(\(.*\)
. Como a palavra foi capturada, podemos nos referir a ela como\1
.Uma versão mais simples:
bater
Isso usa as habilidades de manipulação de string do bash, veja aqui para mais detalhes.
Mais festança
Perl, onde é claro, existem muitas maneiras de fazer isso:
As
-a
marcasperl
se comportam comoawk
, dividindo linhas no espaço em branco e salvando na matriz@F
. Em seguida, imprimimos o último elemento de@F
($#F
é o número de elementos em@F
). O comando-l
diz ao perl para adicionar uma nova linha a cadaprint
instrução, a de-n
que ele deve processar STDIN linha por linha e de-e
executar o script fornecido na linha de comando.As opções foram explicadas acima, estamos apenas excluindo tudo até o último espaço e impressão (
-p
).Aqui estamos passando
Watermelons and cucumbers
como argumentos, que perl salvará na@ARG
matriz e, portanto, imprimimos o último elemento de@ARG
.truques. Este usa
sed
para converter espaços em novas linhas e, em seguida,tail
imprimir apenas a última linha.expressões regulares e grep, usando as
-o
quais imprime apenas a sequência correspondente.traindo
fonte
Aqui está mais uma explicação:
Então, se você precisar do terceiro campo e ele estiver delimitado por espaços '', será
Se você deseja o último campo, provavelmente deve usar o awk .
Nesse caso, torna-se:
Em
awk
NF é o número de campos na linha, então$NF
significa o último campo na linha.fonte