web-dev-qa-db-fra.com

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

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

210
Neuquino

head prend les premières lignes d'un fichier et le paramètre -n peut être utilisé pour spécifier le nombre de lignes à extraire:

line=$(head -n 1 filename)
345
sth

pour lire la première ligne à l’aide de bash, utilisez la commande read. par exemple

read -r firstline<file

firstline sera votre variable (pas besoin d'attribuer à un autre)

52
ghostdog74

Cela suffit et stocke la première ligne de filename dans la variable $line:

read -r line < filename

J'aime aussi awk pour cela:

awk 'NR==1 {print; exit}' file

Pour stocker la ligne elle-même, utilisez la syntaxe var=$(command). 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 la 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
11
fedorqui
line=$(head -1 file)

Travaillera bien. (Comme réponse précédente). Mais

line=$(read -r FIRSTLINE < filename)

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

10
jackbot

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

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

La question ne demandait pas ce qui était le plus rapide, mais pour ajouter à la réponse sed, -n '1p' fonctionne mal, car l'espace de modèle est toujours analysé sur des fichiers volumineux. Par curiosité, j'ai trouvé que 'head' l'emporte de peu 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
4
Neil McGill