Eu tenho um comando, por exemplo: echo "word1 word2"
. Eu quero colocar um pipe ( |
) e obter word1 do comando.
echo "word1 word2" | ....
Não sei o que colocar depois do cano.
O Awk é uma boa opção se você precisar lidar com espaços em branco à direita, porque ele cuidará disso para você:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
O Cut não vai resolver isso:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
'cut' aqui não imprime nada / espaço em branco, porque a primeira coisa antes de um espaço era outro espaço.
-F","
substituir o separador de campo padrão (um espaço) por vírgula.não há necessidade de usar comandos externos. O próprio Bash pode fazer o trabalho. Supondo que "word1 word2" você tenha obtido de algum lugar e armazenado em uma variável, por exemplo
agora você pode atribuir $ 1 ou $ 2 etc a outra variável, se quiser.
fonte
stdin
. @Mat M.--
significastdin
, então$string
está sendo passado comostdin
.stdin
é um espaço em branco-separados em argumentos$1
,$2
,$3
, etc. - assim como quando uma festança Avalia programa argumentos (por exemplo, cheque$1
,$2
etc.), esta abordagem tira proveito da tendência do shell para dividir ostdin
em argumentos automaticamente, eliminando a necessidade deawk
oucut
.set
define os argumentos do shell.word1=$(IFS=" " ; set -- $string ; echo $1)
Defina o IFS para reconhecer corretamente o espaço entre as palavras. Coloque parênteses para evitar espantar o conteúdo original de $ 1.string="*"
. Surpresa.Eu acho que uma maneira eficiente é o uso de matrizes bash:
Além disso, você pode ler diretamente matrizes em uma linha de tubulação:
fonte
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Surpresa.while
sintaxe para recuperar cada primeira palavra em cada linha. Caso contrário, use a abordagem do Boontawee Home. Além disso, observe queecho "${array[0]}"
foi citado para impedir a expansão, conforme observado pelo gniourf-gniourf.Isso tem a vantagem de não usar comandos externos e deixa intactas as variáveis $ 1, $ 2 etc.
fonte
$1, $2, …
intactas é um recurso extremamente útil para escrever scripts!Se você tiver certeza de que não há espaços à esquerda, poderá usar a substituição do parâmetro bash:
Cuidado para escapar do espaço único. Veja aqui mais exemplos de padrões de substituição. Se você tem bash> 3.0, também pode usar correspondência de expressão regular para lidar com espaços à esquerda - veja aqui :
fonte
Você poderia tentar awk
Com o awk, é muito fácil escolher qualquer palavra que você goste (US $ 1, US $ 2, ...)
fonte
Usando expansão de parâmetro do shell
%% *
Aqui está outra solução usando a expansão de parâmetros do shell . Ele cuida de vários espaços após a primeira palavra. A manipulação de espaços na frente da primeira palavra requer uma expansão adicional.
Explicação
Os
%%
significa eliminar a maior correspondência possível de*
(um espaço seguido por qualquer número de quaisquer outros caracteres) no arrasto partestring
.fonte
Eu me perguntava como várias das principais respostas se comparam em termos de velocidade. Eu testei o seguinte:
1 @ mattbh's
2 @ ghostdog74
3 @ boontawee-casa
e 4 @ boontawee-home's
Eu os medi com o tempo do Python em um script Bash em um terminal Zsh no macOS, usando uma sequência de teste com 215 palavras de 5 letras. Realizou cada medição cinco vezes (os resultados foram todos para 100 voltas, melhor de 3) e calculou a média dos resultados:
Bom trabalho, eleitores 👏 Os votos (até o momento em que escrevemos) correspondem à velocidade das soluções!
fonte
read -a
é inválido no traço).cut corta o 1º campo (-f 1) de uma lista de campos delimitados pela string "" (-d "")
fonte
read
é seu amigo:Se a string estiver em uma variável:
Se você estiver trabalhando em um pipe: primeiro caso: você quer apenas a primeira palavra da primeira linha:
segundo caso: você quer a primeira palavra de cada linha:
Eles funcionam se houver espaços à esquerda:
fonte
Como o perl incorpora a funcionalidade do awk, isso também pode ser resolvido com o perl:
fonte
Eu estava trabalhando com um dispositivo incorporado que não possuía perl, awk ou python e o fez com o sed. Ele suporta vários espaços antes da primeira palavra (que as soluções
cut
ebash
não manipularam).Isso foi muito útil quando grepping
ps
para IDs de processo, pois as outras soluções aqui usando apenas o bash não conseguiram remover os primeiros espaçosps
usados para alinhar.fonte