330 votes

Comment obtenir la première ligne d'un fichier dans un bash script ?

Je dois mettre dans une variable bash la première ligne d'un fichier. Je suppose que c'est avec la commande grep, mais y a-t-il un moyen de restreindre le nombre de lignes ?

530voto

sth Points 91594

head prend les premières lignes d'un fichier, et la fonction -n peut être utilisé pour spécifier combien de lignes doivent être extraites :

line=$(head -n 1 filename)

4 votes

Les frais généraux sont nettement plus élevés que ceux de la read approche. $() bifurque d'un sous-shell, et en utilisant une commande externe ( cualquier commande externe) signifie que vous appelez execve() l'invocation du linker et du loader (s'il utilise des bibliothèques partagées, ce qui est généralement le cas), etc.

2 votes

Il pourrait être encore plus court : line="$(head -1 FILENAME)"

3 votes

Et aussi : line=`head -1 FILENAME`

81voto

ghostdog74 Points 86060

Pour lire la première ligne en utilisant bash, utilisez read déclaration. eg

read -r firstline<file

firstline sera votre variable (pas besoin de l'assigner à une autre)

1 votes

@sorin, cat ... | read VAR échouera dans la plupart des shells (tous sauf zsh pour autant que je sache) parce que chacun des composants d'un tuyau fonctionnera dans des sous-shells séparés. Ce qui signifie que $VAR seront définis dans les sous-shells (qui cessent d'exister dès que l'exécution du pipeline est terminée) plutôt que dans le shell qui les invoque. Vous pouvez contourner ce problème avec read VAR <<EOF\n$(cat ...)\nEOF (où chaque \n est un saut de ligne).

0 votes

@sorin, cat est une pure surcharge ; il est beaucoup plus efficace de read -r var <file que cat file | read de toute façon, même si ce dernier n'a pas échoué pour les raisons décrites en BashFAQ #24 .

0 votes

...si vous exécutez quelque chose de plus compliqué que cat entonces read -r var < <(otherprog ...)

34voto

fedorqui Points 42938

Cela suffit et enregistre 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 l'option var=$(command) la 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 échantillon lorsque nous nourrissons le read con seq 10 c'est-à-dire une séquence de chiffres de 1 à 10 :

$ read -r line < <(seq 10) 
$ echo "$line"
1

$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1

0 votes

Oui, head -n1 sera plus rapide (plus petit binaire à charger) et read sera le plus rapide (pas de binaire à charger, c'est un builtin). J'aime particulièrement grep -m1 --color . lorsque je n'imprime que la première ligne, car il colore également la ligne, ce qui est idéal pour les titres de tableaux.

2 votes

sed '1!d;q' (ou sed -n '1p;q' ) imitera votre awk et empêcher la lecture plus loin dans le fichier. Puisque 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). (Ceci n'est pas une réponse à la demande de downvote).

1 votes

@AdamKatz C'est un très bel ensemble de moyens, merci ! Je trouve que celle avec grep très intelligent. On peut bien sûr aussi dire head -n 1 file .

14voto

jackbot Points 1083
line=$(head -1 file)

Cela fonctionnera très bien. (Comme la réponse précédente). Mais

line=$(read -r FIRSTLINE < filename)

sera légèrement plus rapide que read est une commande bash intégrée.

24 votes

La deuxième méthode ne fonctionne pas comme écrit, car read n'imprime rien (donc line se termine par un blanc), et s'exécute également dans un sous-shell (donc FIRSTLINE est défini sur la première ligne, mais seulement dans le sous-shell, donc il n'est pas disponible par la suite). Solution : utilisez simplement read -r line <filename

0 votes

Line=$(read -r < nom de fichier ; printf %s "$REPLY") devrait fonctionner ou alternativement line=$(read -r < <(une commande) ; printf %s "$REPLY")

10voto

openwonk Points 7520

Juste echo la première liste de votre fichier source dans votre fichier cible.

echo $(head -n 1 source.txt) > target.txt

6 votes

Pour laquelle head -n 1 source.txt > target.txt fera exactement la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X