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.
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.
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}
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
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$'
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 -n8 -d$'
'-N8
'-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%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 .
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.