Obtenir la première ligne de la sortie d'une commande shell

96

En essayant de lire le numéro de version de vim, j'obtiens beaucoup de lignes supplémentaires que je dois ignorer. J'ai essayé de lire le manuel headet essayé la commande suivante:

vim --version | head -n 1

Je veux savoir si c'est la bonne approche?

john doe
la source
4
Comment cela a-t-il échoué? Ça marche pour moi.
choroba
1
La syntaxe est correcte. Quelle est l'erreur ..?
Kaushik Nayak
1
Cela fonctionne pour moi, mais peut-être que vous utilisez une version de vim qui écrit les informations de version sur stderr. Essayezvim --version 2>&1 | sed 1q
William Pursell
Fonctionne aussi pour moi - donc oui, votre approche est correcte :)Vérifiez si votre package stderrgénère ces informations sous la forme @WilliamPursell.
David C. Rankin le

Réponses:

132

Oui, c'est une façon d'obtenir la première ligne de sortie d'une commande.

Si la commande renvoie une erreur standard que vous souhaitez capturer de la même manière, vous devez rediriger l'erreur standard de la commande vers le flux de sortie standard:

utility 2>&1 | head -n 1

Il existe également de nombreuses autres façons de capturer la première ligne, notamment sed 1q(quitter après la première ligne), sed -n 1p(imprimer uniquement la première ligne, mais tout lire), awk 'FNR == 1'(imprimer uniquement la première ligne, mais encore une fois, tout lire) etc.

Kusalananda
la source
4

J'utiliserais:

awk 'FNR <= 1' file_*.txt

Comme @Kusalananda le souligne, il existe de nombreuses façons de capturer la première ligne en ligne de commande, mais l'utilisation de head -n 1peut ne pas être la meilleure option lors de l'utilisation de caractères génériques car elle imprimera des informations supplémentaires. Changer 'FNR == i'en 'FNR <= i'permet d'obtenir les i premières lignes.

Par exemple, si vous avez n fichiers nommés file_1.txt, ... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Mais avec des headjokers, imprimez le nom du fichier:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye
alémol
la source
1
Voirhead -qn1 file_*.txt
F.Hauri