Получить первую строку вывода команды оболочки

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
F. Hauri