Existe um comando como cat
no Linux que pode retornar uma quantidade especificada de caracteres de um arquivo?
por exemplo, eu tenho um arquivo de texto como:
Hello world
this is the second line
this is the third line
E eu quero algo que retorne os primeiros 5 caracteres, que seria "olá".
obrigado
linux
command-line
pbreault
fonte
fonte
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
também consome o" world\n"
que se perde para sempre.Respostas:
head
funciona também:.. extrairá os primeiros 100 bytes e os retornará.
O que é bom em usar
head
para isso é que a sintaxe paratail
correspondências:Você pode combiná-los para obter intervalos de bytes. Por exemplo, para obter os segundos 100 bytes de um arquivo, leia os primeiros 200 com
head
e use tail para obter os últimos 100:fonte
head
e usetail
para obter os últimos 10, por exemplo:head -c 20 file | tail -c 10
Você pode usar o dd para extrair pedaços arbitrários de bytes.
Por exemplo,
copiaria os bytes 1235 a 1239 de sua entrada para sua saída e descartaria o resto.
Para obter apenas os primeiros cinco bytes da entrada padrão, faça:
Observe que, se você quiser especificar o nome do arquivo de entrada, dd tem análise de argumento antiquada, então você faria:
Observe também que dd anuncia detalhadamente o que fez, então, para jogá-lo fora, faça:
ou
fonte
dd bs=1
força o dd a ler e escrever um único caractere por vez, o que é muito mais lento do quehead
quando a contagem é grande. Não é perceptível para count = 5, no entanto.dd
, ao que parece, vou resolver o problema ... Saúde!head -c
implementar add bs=5 count=1
abordagem funcionoucabeça :
Nome
head - mostra a primeira parte dos arquivos
Sinopse
cabeça [ OPÇÃO ] ... [ ARQUIVO ] ...
Descrição
Imprima as primeiras 10 linhas de cada ARQUIVO na saída padrão. Com mais de um ARQUIVO, preceda cada um com um cabeçalho com o nome do arquivo. Sem FILE, ou quando FILE for -, leia a entrada padrão.
Argumentos obrigatórios para opções longas também são obrigatórios para opções curtas.
-c , --bytes = [-] N imprime os primeiros N bytes de cada arquivo; com o '-' inicial, imprime todos, exceto os últimos N bytes de cada arquivo
fonte
cabeça ou cauda também podem fazer isso:
Imprime os primeiros X bytes (não necessariamente caracteres se for um arquivo UTF-16) do arquivo. tail fará o mesmo, exceto para os últimos X bytes.
Este (e o corte) são portáteis.
fonte
este script fornece o número exato de caracteres da linha e localização específica, por exemplo:
dá os caracteres na linha 5 e os caracteres 5 a 8 da linha 5,
Nota :
tail -1
é usado para selecionar a última linha exibida pelo cabeçote.fonte
você também pode cortar a linha e cortá-la como, por exemplo:
nome do arquivo grep 'text' | cut -c 1-5
fonte
Eu sei que a resposta é em resposta a uma pergunta feita 6 anos atrás ...
Mas eu estava procurando por algo semelhante por algumas horas e então descobri que: cut -c faz exatamente isso, com um bônus adicional de que você também pode especificar um deslocamento.
cut -c 1-5 retornará Hello e cut -c 7-11 retornará world . Não há necessidade de nenhum outro comando
fonte
Mesmo que isso tenha sido respondido / aceito anos atrás, a resposta atualmente aceita é correta apenas para codificações de um byte por caractere como iso-8859-1, ou para subconjuntos de byte único de conjuntos de caracteres de bytes variáveis (como caracteres latinos em UTF-8). Mesmo usando emendas de bytes múltiplos, em vez disso, ainda funcionaria apenas para codificações de vários bytes fixos como UTF-16. Dado que agora o UTF-8 está a caminho de ser um padrão universal, e ao olhar para esta lista de idiomas por número de falantes nativos e esta lista dos 30 principais idiomas por uso nativo / secundário , é importante apontar um Técnica simples de caracteres de byte variável (não baseada em bytes), usando
cut -c
etr
/sed
com classes de caracteres.Compare o seguinte, que falha duplamente devido a dois erros / presunções centradas no latim comuns em relação ao problema de bytes vs. caracteres (um é
head
vs.cut
, o outro é[a-z][A-Z]
vs.[:upper:][:lower:]
):para isso (nota: isto funcionou bem no FreeBSD, mas ambos
cut
&tr
on GNU / Linux ainda mutilado grega em UTF-8 para me embora):Se o seu
cut
não lidar-c
com codificações de bytes variáveis corretamente, para "os primeirosX
caracteres" (substituaX
pelo seu número), você pode tentar:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- que se limita à primeira linhahead -n 1 | grep -E -o '^.{X}'
- que é limitado à primeira linha e encadeia dois comandos emboradd
- o que já foi sugerido em outras respostas, mas é muito complicadosed
script complicado com buffer de janela deslizante para lidar com caracteres espalhados por várias linhas, mas isso é provavelmente mais complicado / frágil do que apenas usar algo comodd
Se o seu
tr
não lidar com classes de caracteres com codificações de bytes variáveis corretamente, você pode tentar:sed -E -e 's/[[:upper:]]/\L&/g
(Específico do GNU)fonte
printf 'Πού ' | cut -c 1
só retorna rabiscos ... se comporta como 'cabeça'Aqui está um script simples que termina usando a
dd
abordagem mencionada aqui:extract_chars.sh
fonte