Réponses:
head
prend les premières lignes d'un fichier, et le -n
paramètre peut être utilisé pour spécifier le nombre de lignes à extraire:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
ouverture est-il un sous-shell $()
?
$()
syntaxe est plus facile à voir et privilégie la clarté par rapport à la justesse absolue. gnu.org/software/bash/manual/html_node/…
pour lire la première ligne en utilisant bash, utilisez l' read
instruction. par exemple
read -r firstline<file
firstline
sera votre variable (pas besoin de l'attribuer à une autre)
cat ... | read VAR
échouera dans la plupart des shells (tous sauf zsh
pour autant que je sache) car chacun des composants d'un tuyau fonctionnera dans des sous-shells séparés. Signification qui $VAR
sera définie dans le sous-shell (qui cesse d'exister dès que le pipeline a terminé son exécution) plutôt que dans le shell appelant. Vous pouvez contourner cela avec read VAR <<EOF\n$(cat ...)\nEOF
(où chacun \n
est une nouvelle ligne).
cat
est purement aérien; beaucoup plus efficace read -r var <file
que de cat file | read
toute façon, même si ce dernier n'a pas échoué pour les raisons décrites dans BashFAQ # 24 .
cat
, alorsread -r var < <(otherprog ...)
Cela suffit et stocke la première ligne de filename
dans la variable $line
:
read -r line < filename
J'aime aussi awk
pour ça:
awk 'NR==1 {print; exit}' file
Pour stocker la ligne elle-même, utilisez la var=$(command)
syntaxe. Dans ce cas line=$(awk 'NR==1 {print; exit}' file)
,.
Ou même sed
:
sed -n '1p' file
Avec l'équivalent line=$(sed -n '1p' file)
.
Voir un exemple lorsque nous alimentons le read
avec seq 10
, c'est-à-dire une séquence de nombres de 1 à 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'
) imitera votre awk
logique et empêchera la lecture du fichier. Parce que nous ne voulons que la première ligne, nous pouvons alternativement tricher avec sed q
ou awk '1;{exit}'
ou même grep -m1 ^
(moins de code, même logique essentielle). (Ce n'est pas une réponse à l'enquête sur les votes négatifs.)
grep
très intelligent. On peut bien sûr dire aussi head -n 1 file
.
head -n1
sera plus rapide (binaire plus petit à charger) et read
plus rapide (pas de binaire à charger, c'est une fonction intégrée). J'aime particulièrement grep -m1 --color .
lorsque j'imprime la première ligne, car elle colorera également la ligne, ce qui la rend idéale pour les en-têtes de tableau.
line=$(head -1 file)
Fonctionnera bien. (Comme réponse précédente). Mais
line=$(read -r FIRSTLINE < filename)
sera légèrement plus rapide que la read
commande bash intégrée.
read
n'imprime rien (donc line
se vide), et s'exécute également dans un sous-shell (est donc FIRSTLINE
défini sur la première ligne, mais uniquement dans le sous-shell, il n'est donc pas disponible par la suite). Solution: utilisez simplementread -r line <filename
La question n'a pas demandé laquelle est la plus rapide, mais pour ajouter à la réponse sed, -n '1p' fonctionne mal car l'espace de motif est toujours analysé sur les gros fichiers. Par curiosité, j'ai découvert que la «tête» l'emporte de justesse sur sed:
# 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
approche.$()
bifurque un sous-shell, et l'utilisation d'une commande externe ( n'importe quelle commande externe) signifie que vous appelezexecve()
, en invoquant l'éditeur de liens et le chargeur (s'il utilise des bibliothèques partagées, ce qui est généralement le cas), etc.