- Linux вывести только первую строку
- Операции с файлами и фильтрация
- cat, tail, head, tee: Команды для вывода содержимого файлов
- grep: Поиск строк в файлах
- wc: Подсчёт элементов в файлах
- sort: Сортировка содержимого файла
- Команда Head в Linux
- Синтаксис команды Head
- Как использовать команду головы
- Как отобразить определенное количество строк
- Как отобразить определенное количество байтов
- Как отображать несколько файлов
- Как использовать голову с другими командами
- Выводы
- How to print the first line using grep command?
- 5 Answers 5
Linux вывести только первую строку
Библиотека сайта rus-linux.net
Операции с файлами и фильтрация
Основная часть работы в командной строке ведётся с файлами. В этом разделе мы рассмотрим, как просматривать и фильтровать содержимое файлов, извлекать из файлов нужную информацию при помощи одной команды и сортировать их содержимое.
cat, tail, head, tee: Команды для вывода содержимого файлов
Эти команды имеют почти один и тот же синтаксис: имя_команды [опции] [файл(ы)], и могут быть использованы в каналах. Все они используются для вывода части файла согласно определенным критериям.
Утилита cat объединяет файлы и выводит результат на стандартный вывод. Это одна из наиболее широко используемых команд. Вы можете использовать:
для вывода, например, содержимого файла с журналом почтового демона на стандартный вывод [14] . Команда cat имеет очень полезную опцию ( -n ), которая позволяет вам выводить номера строк.
Некоторые файлы, типа журналов демонов (если они запущены) обычно имеют довольно большой размер [15] и полный их вывод на экран будет не очень полезным. Часто вам нужно увидеть только несколько строк из файла. Для этого вы можете воспользоваться командой tail . Следующая команда выведет (по умолчанию) последние 10 строк из файла /var/log/mail/info :
Вы можете использовать опцию -n для вывода последних N строк файла. Например, для вывода последних 2-х строк наберите:
Команда head похожа на tail , но она выводит первые строки файла. Следующая команда выведет (по умолчанию) первые 10 строк файла /var/log/mail/info :
Как и в случае с tail вы можете использовать опцию -n для указания количества выводимых строк. Например, для вывода первых 2-х строк наберите:
Также вы можете использовать эти две команды совместно. Например, если вы хотите увидеть только строки 9 и 10, вы можете воспользоваться командой, в которой head выберет первые 10 строк из файла и передаст их по каналу в команду tail.
# head /var/log/mail/info | tail -n2
Затем вторая часть команды отберет последние 2 строки и выведет их на экран. Таким же способом вы можете выбрать 20-ю от конца файла строку:
# tail -n20 /var/log/mail/info |head -n1
В этом примере мы говорим команде tail выбрать последние 20 строк файла и передать их по каналу в head. Затем команда head выводит на экран первую строку из полученных данных.
Допустим, что результат последнего примера нам нужно одновременно вывести на экран и сохранить его в файл results.txt . В этом нам может поможет утилита tee . Ее синтаксис:
Теперь мы можем изменить предыдущую команду следующим образом:
# tail -n20 /var/log/mail/info |head -n1|tee results.txt
Давайте рассмотрим еще один пример. Нам нужно выбрать последние 20 строк, сохранить их в файл results.txt , а на экран вывести только первую из них. Тогда мы должны ввести следующее:
# tail -n20 /var/log/mail/info |tee results.txt |head -n1
У команды tee есть полезная опция ( -a ), которая позволяет вам дописать данные в конец существующего файла.
Давайте вернемся назад к команде tail . Такие файлы как журналы обычно динамически изменяются, т.к. демон постоянно добавляет в них отчет о совершенных действиях или событиях. Поэтому, если вам нужно наблюдать за изменениями в лог-файле в режиме реального времени, тогда вам нужно воспользоваться преимуществами опции -f :
В этом случае все изменения в файле /var/log/mail/info будут немедленно выводиться на экран. Использование команды tail с опцией -f весьма полезно, когда вам нужно знать, как работает ваша система. Например, наблюдая за файлом журнала /var/log/messages , вы сможете всегда получать обновленную информацию о системных сообщенях и различных демонах.
В следующем разделе мы рассмотрим, как можно использовать утилиту grep в качестве фильтра для отделения сообщений Postfix от сообщений других служб.
grep: Поиск строк в файлах
Ни имя команды, ни ее аббревиатура (“General Regular Expression Parser” — синтаксический анализатор общих регулярных выражений) не слишком интуитивны, но ее действие и ее использование довольно просты для понимания: grep выполняет поиск в одном или нескольких файлах по шаблону, заданному в качестве аргумента. Ее синтаксис:
grep [опции] [один или более файлов]
Если указано несколько файлов, в отображаемом результате их имена будут выводиться перед каждой найденной строкой. Для предотвращения вывода этих имен используйте опцию -h ; используйте опцию -l для вывода только имен файлов с найденными совпадениями. Шаблон — это регулярное выражение, хотя в большинстве случаев он состоит просто из одного слова. Наиболее часто используемые опции:
- -i : поиск без учета регистра (т.е. игнорирование разницы между верхним и нижним регистром);
- -v : обратный поиск. Вывод строк, которые не соответствуют шаблону;
- -n : вывод номера строки для каждой из найденных строк;
- -w : сообщает grep’у, что шаблон должен совпадать со всем словом.
# grep postfix /var/log/mail/info
# cat /var/log/mail/info | grep postfix
# grep -v postfix /var/log/mail/info
# grep postfix /var/log/mail/info |grep status=sent
# echo -e 'status=sent\npostfix' >./patterns.txt
# fgrep -f ./patterns.txt /var/log/mail/info
# echo 'peter@mandrakesoft.com' >>./patterns.txt
# fgrep -f ./patterns.txt /var/log/mail/info | tail -n2 | head -n1
wc: Подсчёт элементов в файлах
- -l : вывод количества новых строк;
- -w : вывод количества слов;
- -m : вывод общего количества символов;
- -c : вывод количества байт;
- -L : вывод длины самой длинной строки в заданном тексте.
$grep "model name" /proc/cpuinfo |wc -l
# fgrep -f ./patterns.txt /var/log/mail/info | wc -l
sort: Сортировка содержимого файла
- -t»:» : сообщает sort ‘у, что разделителем полей является символ «:» ;
- -k3 : означает, что сортировка должна быть выполнена по по третьему столбцу;
- -n : сообщает, что выполняется сортировка числовых данных, а не буквенных.
- -u : строгая сортировка: исключаются повторяющиеся поля сортировки;
- -f : игнорирование регистра (строчные символы обрабатываются так же, как и прописные).
$ sort /etc/passwd -t":" -k3 -n |tail -n1
Команда Head в Linux
Команда head выводит первые строки (по умолчанию 10 строк) одного или нескольких файлов или передаваемых данных в стандартный вывод.
В этом руководстве мы объясним, как использовать утилиту head в Linux, на практических примерах и подробных объяснениях наиболее распространенных опций head.
Синтаксис команды Head
Синтаксис команды head следующий:
- OPTION — варианты головы . Мы рассмотрим наиболее распространенные варианты в следующих разделах.
- FILE — Ноль или более имен входных файлов. Если ФАЙЛ не указан или если ФАЙЛ — — , head будет читать стандартный ввод.
Как использовать команду головы
В простейшей форме при использовании без каких-либо параметров команда head отобразит первые 10 строк.
Как отобразить определенное количество строк
Используйте параметр -n ( —lines ), за которым следует целое число, указывающее количество отображаемых строк:
Вы можете опустить букву n и использовать только дефис ( — ) и цифру (без пробелов между ними).
Чтобы отобразить первые 30 строк файла с именем filename.txt , введите:
Следующее приведет к тому же результату, что и приведенные выше команды:
Как отобразить определенное количество байтов
Параметр -c ( —bytes ) позволяет распечатать определенное количество байтов:
Например, чтобы отобразить первые 100 байтов данных из файла с именем filename.txt , введите:
Вы также можете использовать суффикс множителя после числа, чтобы указать количество отображаемых байтов. b умножает его на 512, kB умножает на 1000, K умножает на 1024, MB умножает на 1000000, M умножает на 1048576 и так далее.
Следующая команда отобразит первые пять килобайт (2048) файла filename.txt :
Как отображать несколько файлов
Если в качестве входных данных для команды head указано несколько файлов, она отобразит первые десять строк из каждого предоставленного файла.
head filename1.txt filename2.txt
Вы можете использовать те же параметры, что и при отображении одного файла.
В этом примере показаны первые 20 строк файлов filename1.txt и filename2.txt :
head -n 20 filename1.txt filename2.txt
Если используется более одного файла, каждому выходному файлу предшествует заголовок с именем файла.
Как использовать голову с другими командами
Команду head можно использовать в сочетании с другими командами, перенаправляя стандартный вывод из / в другие утилиты с помощью каналов.
Следующая команда будет хешировать переменную среды $RANDOM , отображать первые 32 байта и отображать случайную строку из 24 символов:
echo $RANDOM | sha512sum | head -c 24 ; echo
Выводы
К настоящему времени вы должны хорошо понимать, как использовать команду Linux head. Это дополнение к команде tail, которая выводит последние строки файла на терминал.
How to print the first line using grep command?
@steeldriver you need to make it an answer as it is the way to do it with grep, strangely selected tool for the job.
grep is not the best tool for printing the first line of a file. If you simply meant that you wanted to print the first line matched with grep , or if you have some specific use for grep , please let us know what that is. If we had more context, perhaps we could give an answer that would better help you and the community.
@MelBurslan In file.txt I have three lines for example : This is a new file. Second line: The name of the file is newFile Third line : I have not created the new line. So by using grep command how can I print the first line only? Also How which command will help me to print both first and last line? Can you guys please tell me the commands for both the questions?
If any of the existing answers solves your problem, please consider accepting it via the checkmark. Thank you!
5 Answers 5
Although it’s an unconventional application of grep, you can do it in GNU grep using
It works because the empty expression matches anything, while -m1 causes grep to exit after the first match
-m NUM, --max-count=NUM Stop reading a file after NUM matching lines.
This is not something grep does. The name «grep» itself is an acronym for «globally search a regular expression and print», which is what the ed command g/re/p does (for a given regular expression re ).
ed is an interactive line editor from 1969, but it’s most likely installed on your system today nonetheless (it’s a standard POSIX tool). We got grep from ed , and it can be seen as a shortcut or alias for a specific functionality of ed , and sed , which is «stream- ed «, i.e. a (non-interactive) stream editor.
The 1p string is a tiny sed «script» that prints ( p ) the line corresponding to the given address ( 1 , the first line). The editing command 1p would (no surprise) do the same thing in the ed editor by the way.
The -n suppresses the output of anything not explicitly printed by the script, so all we get is the first line of the file file.txt .
This prints all lines of the file, but quits ( q ) at line 1 (after printing it). This is exactly equivalent to head -n 1 file.txt .
In the POSIX standard (in the rationale section for the head command) it says (paraphrasing) that head -n N is much the same as sed ‘Nq’ , i.e. «print every line, but quit at line N «. The reason head was included in the standard at all was due to symmetry with tail and backwards compatibility with existing Unix implementations.
This is the most illuminating answer, the first answer is a weird hack. I knew there was something weird, thank you for showing me the history of grep and ed. It all makes sense now.
Unless the first line has a unique string you cannot do this using only grep. head -n 1 file.txt would work in its place.
If you want to only print out the first line if it matches a pattern then pipe head into grep
Yet Another Unconventional Use of Grep — a Schwartzian Transform that goes through several gyrations to number the lines, then uses grep to look for the line number, then strip the line number back off:
function grep1() ( nlines=$(wc -l < "$1") nlw=$(printf "%d" "$nlines" | wc -c) nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//' ) function greplast() ( nlines=$(wc -l < "$1") nlines=$((nlines + 0)) nlw=$(printf "%d" "$nlines" | wc -c) nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//" )
I'm putting this Answer here as an example of the idea that just because you can do something in (grep or bash or . etc), doesn't mean that you should -- there's probably a better tool for the job. sed ( sed 1q or sed -n 1p ) and head ( head -n 1 ) are the more appropriate tools for printing the first line from a file. For printing the last line of a file, you have tail -n 1 or sed -n '$p' . Not only are these tools a single command (instead of 3+ in the above functions), they are also much clearer for future readers -- perhaps yourself! -- of the scripts they're in. While I am not one of the (currently 3) down-voters of your question, it's likely that your insistence on an arbitrary tool for the job (without any supporting reasons) is the reason for the downvotes. It's extremely unlikely that a system that has grep does not also have head , tail , and sed .