Eu tenho que colocar em uma variável bash a primeira linha de um arquivo. Eu acho que é com o comando grep, mas é alguma maneira de restringir o número de linhas?
249
head
pega as primeiras linhas de um arquivo e o -n
parâmetro pode ser usado para especificar quantas linhas devem ser extraídas:
line=$(head -n 1 filename)
read
abordagem.$()
garfos fora de um subnível, e usando um comando externo ( qualquer comando externo) significa que você está chamandoexecve()
, invocando o vinculador e carregador (se ele está usando bibliotecas compartilhadas, que é geralmente o caso), etc.line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
abertura são um subconjunto,$()
assim como ?.$()
sintaxe é mais fácil de ver e valorize a clareza sobre a concisão absoluta. gnu.org/software/bash/manual/html_node/…Para ler a primeira linha usando o bash, use
read
statement. por exemplofirstline
será sua variável (não é necessário atribuir a outra)fonte
cat ... | read VAR
falhará na maioria dos shells (todos, excetozsh
até onde eu sei), porque cada um dos componentes em um tubo será executado em subshells separados. O significado que$VAR
será definido no subshell (que deixa de existir assim que o pipeline terminar de executar), e não no shell de chamada. Você pode contornar isso comread VAR <<EOF\n$(cat ...)\nEOF
(onde cada\n
uma é uma nova linha).cat
é pura sobrecarga; muito mais eficiente doread -r var <file
que decat file | read
qualquer maneira, mesmo que o último não tenha falhado pelos motivos descritos no BashFAQ # 24 .cat
, em seguida,read -r var < <(otherprog ...)
Isso é suficiente e armazena a primeira linha de
filename
na variável$line
:Eu também gosto
awk
disso:Para armazenar a própria linha, use a
var=$(command)
sintaxe. Nesse casoline=$(awk 'NR==1 {print; exit}' file)
,.Ou até
sed
:Com o equivalente
line=$(sed -n '1p' file)
.Veja um exemplo quando alimentamos
read
comseq 10
, ou seja, uma sequência de números de 1 a 10:fonte
sed '1!d;q'
(oused -n '1p;q'
) imitará suaawk
lógica e impedirá a leitura adicional no arquivo. Como queremos apenas a primeira linha, podemos enganar alternativamente comsed q
ouawk '1;{exit}'
ou atégrep -m1 ^
(menos código, a mesma lógica essencial). (Isto não é uma resposta ao inquérito downvote.)grep
muito inteligente. É claro que também podemos dizerhead -n 1 file
.head -n1
será mais rápido (binário menor para carregar) eread
será mais rápido (não há carregamento binário, isso é incorporado). Eu gosto especialmentegrep -m1 --color .
quando estou imprimindo a primeira linha, porque ela também será colorida, tornando-a excelente para títulos de tabelas.Vai funcionar bem. (Como resposta anterior). Mas
será marginalmente mais rápido, como
read
é um comando interno do bash.fonte
read
não imprime nada (entãoline
acaba em branco) e também é executado em um subshell (entãoFIRSTLINE
é definido como a primeira linha, mas apenas no subshell, para que não esteja disponível posteriormente). Solução: useread -r line <filename
Apenas
echo
a primeira lista do seu arquivo de origem no seu arquivo de destino.fonte
head -n 1 source.txt > target.txt
realizará exatamente o mesmo.A pergunta não perguntou qual é a mais rápida, mas para adicionar à resposta sed, -n '1p' está com um desempenho ruim, pois o espaço do padrão ainda é verificado em arquivos grandes. Por curiosidade, descobri que a 'cabeça' ganha sobre sed por pouco:
fonte