Pegando os primeiros caracteres [x] para uma string de um pipe

51

Se eu tiver uma saída muito longa de um comando (linha única), mas sei que só quero os primeiros caracteres [x] (digamos 8) da saída, qual é a maneira mais fácil de obter isso? Não há delimitadores.

    
por xenoterracide 24.10.2010 / 01:07

6 respostas

74

Uma maneira é usar cut :

 command | cut -c1-8

Isso lhe dará os 8 primeiros caracteres de cada linha de saída. Como cut faz parte do POSIX, é provável que esteja na maioria dos Unices.

    
por 24.10.2010 / 01:20
23

Estas são algumas outras maneiras de obter apenas 8 primeiros caracteres.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*//;q'

E se você tiver bash

var=$(command)
echo ${var:0:8}
    
por 24.10.2010 / 06:34
2

Outra solução de um liner usando a expansão do parâmetro

echo ${word:0:x}

EG: word="Hello world"
echo ${word:0:3} or echo ${word::3} 
o/p: Hel


EG.2: word="Hello world"
echo ${word:1:3}
o/p: ell
    
por 15.11.2018 / 09:40
1

Se você tiver um shell suficientemente avançado (por exemplo, o seguinte funcionará no Bash, não tenho certeza sobre traço), você pode fazer:

read -n8 -d$'
$ echo abcdefghijklm | { read -n8 -d$'
read -n8 -d$'
$ echo abcdefghijklm | { read -n8 -d$'%pre%' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
' -r <(command)
' -r; printf "REPLY=<%s>\n" "$REPLY"; } REPLY=<abcdefgh>
' -r <(command)

Depois de executar read ... <(command) , seus caracteres estarão na variável REPLY da shell. Digite help read para aprender sobre outras opções.

Explicação: o argumento -n8 para read diz que queremos até 8 caracteres. O -d$'-n8 -d$'-N8'' diz ler até um nulo, em vez de uma nova linha. Dessa forma, a leitura continuará por 8 caracteres, mesmo se um dos caracteres anteriores for uma nova linha (mas não se for um nulo). Uma alternativa para -N é usar -n , que lê exatamente 8 caracteres ou até que o stdin chegue ao EOF. Nenhum delimitador é honrado. Isso provavelmente atende melhor às suas necessidades, mas não sei de antemão quantos shells foram lidos que honram -d em vez de honrarem -r e \ . Continuando com a explicação: \ diz ignorar \ -escapes, de modo que, por exemplo, tratamos read ... <(command) como dois caracteres, em vez de um único command | read ... .

Por fim, fazemos %code% em vez de %code% porque na segunda forma, a leitura é executada em uma subcamada que é imediatamente encerrada, perdendo as informações que você acabou de ler.

Outra opção é fazer todo o seu processamento dentro do subshell. Por exemplo:

%pre%     
por 08.09.2012 / 16:02
1

Isso é portátil:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

Para criar uma string de tamanho variável de caracteres sua própria pergunta aqui .

    
por 23.08.2015 / 09:12
0

Eu tive esse problema ao gerar manualmente arquivos de soma de verificação no repositório maven. Infelizmente cut -c sempre imprime uma nova linha no final da saída. Para impedir que eu use xxd :

command | xxd -l$BYTES | xxd -r

Ele produz exatamente $BYTES bytes, a menos que a saída de command seja menor, então exatamente a saída.

    
por 05.01.2017 / 18:28