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-il possible de restreindre le nombre de lignes?
249
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)
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.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 exemplefirstline
sera votre variable (pas besoin de l'attribuer à une autre)la source
cat ... | read VAR
échouera dans la plupart des shells (tous saufzsh
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 avecread VAR <<EOF\n$(cat ...)\nEOF
(où chacun\n
est une nouvelle ligne).cat
est purement aérien; beaucoup plus efficaceread -r var <file
que decat 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
:J'aime aussi
awk
pour ça:Pour stocker la ligne elle-même, utilisez la
var=$(command)
syntaxe. Dans ce casline=$(awk 'NR==1 {print; exit}' file)
,.Ou même
sed
:Avec l'équivalent
line=$(sed -n '1p' file)
.Voir un exemple lorsque nous alimentons le
read
avecseq 10
, c'est-à-dire une séquence de nombres de 1 à 10:la source
sed '1!d;q'
(oused -n '1p;q'
) imitera votreawk
logique et empêchera la lecture du fichier. Parce que nous ne voulons que la première ligne, nous pouvons alternativement tricher avecsed q
ouawk '1;{exit}'
ou mêmegrep -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 aussihead -n 1 file
.head -n1
sera plus rapide (binaire plus petit à charger) etread
plus rapide (pas de binaire à charger, c'est une fonction intégrée). J'aime particulièrementgrep -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.Fonctionnera bien. (Comme réponse précédente). Mais
sera légèrement plus rapide que la
read
commande bash intégrée.la source
read
n'imprime rien (doncline
se vide), et s'exécute également dans un sous-shell (est doncFIRSTLINE
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
Juste
echo
la première liste de votre fichier source dans votre fichier cible.la source
head -n 1 source.txt > target.txt
accomplira exactement la même chose.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:
la source