Respostas:
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)
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 exemplo
read -r firstline<file
firstline
será sua variável (não é necessário atribuir a outra)
cat ... | read VAR
falhará na maioria dos shells (todos, exceto zsh
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 com read VAR <<EOF\n$(cat ...)\nEOF
(onde cada \n
uma é uma nova linha).
cat
é pura sobrecarga; muito mais eficiente do read -r var <file
que de cat 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
:
read -r line < filename
Eu também gosto awk
disso:
awk 'NR==1 {print; exit}' file
Para armazenar a própria linha, use a var=$(command)
sintaxe. Nesse caso line=$(awk 'NR==1 {print; exit}' file)
,.
Ou até sed
:
sed -n '1p' file
Com o equivalente line=$(sed -n '1p' file)
.
Veja um exemplo quando alimentamos read
com seq 10
, ou seja, uma sequência de números de 1 a 10:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(ou sed -n '1p;q'
) imitará sua awk
lógica e impedirá a leitura adicional no arquivo. Como queremos apenas a primeira linha, podemos enganar alternativamente com sed q
ou awk '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 dizer head -n 1 file
.
head -n1
será mais rápido (binário menor para carregar) e read
será mais rápido (não há carregamento binário, isso é incorporado). Eu gosto especialmente grep -m1 --color .
quando estou imprimindo a primeira linha, porque ela também será colorida, tornando-a excelente para títulos de tabelas.
line=$(head -1 file)
Vai funcionar bem. (Como resposta anterior). Mas
line=$(read -r FIRSTLINE < filename)
será marginalmente mais rápido, como read
é um comando interno do bash.
read
não imprime nada (então line
acaba em branco) e também é executado em um subshell (então FIRSTLINE
é definido como a primeira linha, mas apenas no subshell, para que não esteja disponível posteriormente). Solução: useread -r line <filename
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:
# best:
head -n1 $bigfile >/dev/null
# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null
# VERY slow:
sed -n '1p' $bigfile >/dev/null
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.