Отримайте перший рядок виводу команди оболонки


96

Намагаючись прочитати номер версії vim, я отримую багато додаткових рядків, які мені потрібно ігнорувати. Я спробував прочитати керівництво headта спробував наступну команду:

vim --version | head -n 1

Я хочу знати, чи це правильний підхід?


4
Як це не вдалося? Це працює для мене.
choroba

1
Синтаксис правильний. В чому помилка ..?
Kaushik Nayak

1
Це працює для мене, але, можливо, ви використовуєте версію vim, яка пише інформацію про версію в stderr. Спробуйтеvim --version 2>&1 | sed 1q
Вільям Перселл

Працює і для мене - так що так, ваш підхід правильний :)Перевірте, чи виводить ваш пакет таку інформацію stderrяк @WilliamPursell, перевірку.
Девід К. Ранкін,

Відповіді:


132

Так, це один із способів отримати перший рядок результату від команди.

Якщо команда видає що-небудь до стандартної помилки, яку ви хотіли б зафіксувати таким же чином, вам потрібно перенаправити стандартну помилку команди на стандартний вихідний потік:

utility 2>&1 | head -n 1

Є також багато інших способів захопити перший рядок, у тому числі sed 1q(вийти після першого рядка), sed -n 1p(лише надрукувати перший рядок, але прочитати все), awk 'FNR == 1'(лише надрукувати перший рядок, але знову ж таки, прочитати все) тощо.


4

Я б використав:

awk 'FNR <= 1' file_*.txt

Як зазначає @Kusalananda, існує багато способів зафіксувати перший рядок у командному рядку, але використання head -n 1можливо не найкращого варіанту при використанні символів підстановки, оскільки він надрукує додаткову інформацію. Зміна 'FNR == i'на'FNR <= i' дозволяє отримати перші рядки i.

Наприклад, якщо у вас є n файлів з ім'ям file_1.txt, ... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Але за допомогою headсимволів підстановки надрукуйте ім'я файлу:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye

1
Див.head -qn1 file_*.txt
Ф. Хаурі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.