- Peter Leung, «Командная строка: маленькие хитрости от Linux Commando»
- Как в Linux вывести строку?
- Как вывести сходу информацию из двух созданных файлов?
- Как вывести некоторую строку файла в Linux?
- Как вывести 5-ый строку в Linux?
- Как вывести нужные строки в Linux из файла с помощью sed?
- Команда awk в Linux
- Возможности команды awk
- Синтаксис
- Использование команды awk в Linux
- Вывод содержимого файла
- Счётчик номеров строк
- Вывод определённых столбцов
- Вывод определённых строк
- Вывод строк с определённым шаблоном
- Использование регулярных выражений
- Использование операторов сравнения
- Заключение
Peter Leung, «Командная строка: маленькие хитрости от Linux Commando»
Тому, кто пишет много скриптов bash, часто приходится выбирать нужные строки из текста, например готовые блоки кода. Вчера я как раз должен был извлечь первую строку из файла, назовем его somefile.txt.
$ cat somefile.txt Line 1 Line 2 Line 3 Line 4
Это очень просто сделать при помощи команды head:
$ head -1 somefile.txt Line 1
Для более сложных задач, например, извлечь вторую и третью строки из того же файла, команда head не подходит.
Давайте попробуем команду sed ≈ редактор потока (STream Editor).
Моя первая попытка применить команду p (print) оказалась неудачной:
$ sed 1p somefile.txt Line 1 Line 1 Line 2 Line 3 Line 4
Обратите внимание, что редактор печатает весь файл, причем указанную первую строку печатает дважды. Почему? По умолчанию редактор перепечатывает на стандартный вывод каждую строку вводимого файла. Четко заданная команда 1p приказывает печатать первую строку. В итоге первая строка дублируется.
Чтобы этого не происходило нужно подавить дефолтный вывод при помощи опции -n, чтобы на выводе был только результат команды 1p:
$ sed -n 1p somefile.txt Line 1
Можно пойти другим путем и удалить из файла все строки, кроме первой:
$ sed '1!d' somefile.txt Line 1
где ‘1!d’ означает: если строка не является первой (!), то подлежит удалению. Обратите внимания на кавычки (одинарные). Они совершенно необходимы, так как без них конструкция 1!d вызовет последнюю запускавшуюся в шелле команду, начинающуюся с буквы d.
Для извлечения нескольких строк, скажем, со второй по четвертую, можно поступить одним из следующих способов:
Интервал обозначается через запятую включительно.
А если строки не идут друг за другом, например, с первой по вторую и еще четвертую?
$ sed -n -e 1,2p -e 4p somefile.txt Line 1 Line 2 Line 4
Если вам известны иные способы выбирать нужные строки из файлов, сообщите, пожалуйста, в комментариях.
Послесловие переводчика:
Блестящий пример нестандартного подхода продемонстрировал в комментариях к этой статье некий Chris:
$ head -n 5 имя_файла | tail -n 1
А правда, здорово! И никаких заумных команд не надо с их километровыми манами. Кстати так и нужные блоки подряд идущих строк можно извлекать.
Как в Linux вывести строку?
Начнем с команды, с которой уже не однократно встречались, команда cat. Сначала посмотрим справку по данной команде с помощью man cat. Этая команда предназначена для объединения файлов и печати на стандартный вывод информации. Под стандартным выводом предполагается вывод на консоль информации. Так же можно увидеть, что у данной команды есть ключи.
Как вывести сходу информацию из двух созданных файлов?
А в справке было написано, что команда сможет объединять содержимое файлов.
cat hello1.txt hello2.txt > hello3.txt
cat hello3.txt
Мы вывели на стандартный вывод (консоль) содержание файлов и передали то, что на экране в новый файл hello3.txt. А затем просто вывели на консоль.
Как вывести некоторую строку файла в Linux?
При трейсе ошибки установки одного скрипта, возникла необходимость прочитать 98 строку файла. Делается это, ожидаемо, через команду вывода cat
# cat filename | head -n98 | tail -n1
где head -n предлагает сделать нужную строку, а tail -n задает сколько строк показать перед нужной. В данном варианте показана будет только одна строка.
То есть если нам необходимо вывести какой-никакой то сегмент строк, скажем, строки с 10 по 20, то выражение будет иметь вид
# cat filename | head -n20 | tail -n11
Как вывести 5-ый строку в Linux?
Если я хочу извлечь пятую строку файла, то делаю так:
$ head -n 5 имя_файла | tail -n 1
#!/bin/bash
for i in $(find /etc/ -type f);
do cat $i | head -n5 | tail -n1 >> ~/000
done
sort ~/000
Данный скрипт на bash хватит всё файлы из папки etc, с них берёт пятую строку и выводит в файл, который создаёт в домашнем каталоге, а затем сортирует.
Как вывести нужные строки в Linux из файла с помощью sed?
Тому, кто пишет много скриптов bash, довольно частенько приходится выбирать нужные строки из текста, например готовые блоки кода. Вчера я как раз обязан был извлечь первую строку из файла, назовем его somefile.txt.
$ cat somefile.txt
Line 1
Line 2
Line 3
Line 4
Это весьма просто сделать при помощи команды head:
$ head -1 somefile.txt
Line 1
Для более сложных задачек, например, извлечь вторую и третью строки из того же файла, команда head не подходит. Подавайте попробуем команду sed ? редактор потока (STream Editor). Моя первая попытка применить команду p (print) очутилась неудачной:
$ sed 1p somefile.txt
Line 1
Line 1
Line 2
Line 3
Line 4
Обратите внимание, что редактор отпечатывает весь файл, причем указанную первую строку печатает дважды. Почему? По умолчанию редактор перепечатывает на типовой вывод каждую строку вводимого файла. Четко заданная команда 1p приказывает печатать первоначальную строку. В итоге первая строка дублируется. Чтобы этого не происходило нужно подавить дефолтный вывод при поддержки опции -n, чтобы на выводе был только результат команды 1p:
$ sed -n 1p somefile.txt
Line 1
Можно пойти иным путем и удалить из файла все строки, кроме первой:
$ sed ‘1!d’ somefile.txt
Line 1
где ‘1!d’ значит: если строка не является первой (!), то подлежит удалению. Обратите внимания на кавычки (одинарные). Они асбсолютно необходимы, так как без них конструкция 1!d вызовет последнюю запускавшуюся в шелле команду, начинающуюся с буквы d. Для извлечения многих строк, скажем, со второй по четвертую, можно поступить одним из следующих способов:
$ sed -n 2,4p somefile.txt
$ sed ‘2,4!d’ somefile.txt
Перерыв обозначается через запятую включительно. А если строки не идут друг за другом, например, с первоначальной по вторую и еще четвертую?
$ sed -n -e 1,2p -e 4p somefile.txt
Команда awk в Linux
В Linux команда awk используется в командной строке для обработки текста. Она позволяет выполнять действия над строками в соответствии с заданным шаблоном.
Скриптовый язык awk не требует компиляции и позволяет пользователю использовать переменные, числовые функции, строковые функции и логические операторы при написании крошечных, но очень эффективных программ.
Возможности команды awk
Утилита способна выполнять следующие операции:
- сканирование файла построчно;
- разбиение каждую строку ввода на поля;
- сравнивание строки/поля ввода с образцом;
- действия над совпавшими строками;
- преобразование файлов данных;
- создание форматированных отчетов;
- форматирование строк вывода;
- арифметические и строковые операции;
- условные операторы и циклы.
Синтаксис
Использование команды awk в Linux
Для ознакомления с использованием утилиты создаём простой текстовый файл:
oleg@mobile:~/Directory:$ touch example1.txt oleg@mobile:~/Directory:$
Наполняем созданный файл текстом и смотрим полученный результат:
oleg@mobile:~/Directory:$ cat example.txt fristName lastName age city ID Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Sidor Sidorov 52 Sofia N/A Paul Pavlov 33 London 300 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$
В созданном файле 5 столбцов: fristName , lastName , age , city , ID .
Вывод содержимого файла
Чтобы вывода всего содержимого файла, внутри фигурных скобок следует указать действие print $0 :
oleg@mobile:~/Directory:$ awk '' example.txt fristName lastName age city ID Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Sidor Sidorov 52 Sofia N/A Paul Pavlov 33 London 300 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$
Счётчик номеров строк
Для того чтобы каждая строка имела счетчик номеров строк, следует использовать встроенную переменную NR :
oleg@mobile:~/Directory:$ awk '' example.txt 1 fristName lastName age city ID 2 3 Ivan Ivanov 28 Toronto 400 4 Peter Petrov 43 Berlin 600 5 Sidor Sidorov 52 Sofia N/A 6 Paul Pavlov 33 London 300 7 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$
Вывод определённых столбцов
При использовании команды awk можно указать в выводе лишь определённые столбцы. Для примера выводим первый столбец:
oleg@mobile:~/Directory:$ awk '' example.txt fristName Ivan Peter Sidor Paul Carl oleg@mobile:~/Directory:$
Для вывода второго столбца используется, естественно, $2 :
oleg@mobile:~/Directory:$ awk '' example.txt lastName Ivanov Petrov Sidorov Pavlov Carlson oleg@mobile:~/Directory:$
Для вывода более одного столбца, например, первого, второго и четвертого выполняется следующее:
oleg@mobile:~/Directory:$ awk '' example.txt fristName lastName city Ivan Ivanov Toronto Peter Petrov Berlin Sidor Sidorov Sofia Paul Pavlov London Carl Carlson Rome oleg@mobile:~/Directory:$
Для вывода последнего столбца можно использовать $NF , представляющее последнее поле в записи:
oleg@mobile:~/Directory:$ awk '' example.txt ID 400 600 N/A 300 N/A oleg@mobile:~/Directory:$
Вывод определённых строк
Можно выводить и определённые строки, например, из выбранного столбца. Для примера выводим первую строку первого столбца:
oleg@mobile:~/Directory:$ awk '' example.txt ID 400 600 N/A 300 N/A oleg@mobile:~/Directory:$
Разберём выполненную команду. awk » example.txt вывела первый столбец. Затем выходные данные этой команды были переданы с помощью символа вертикальной черты | в команду head , где её аргумент -1 выбрал первую строку столбца.
Следовательно, при желании вывести две строки, например первую и вторую необходимо выполнить следующее:
oleg@mobile:~/Directory:$ awk '' example.txt | head -2 fristName oleg@mobile:~/Directory:$
Обратите внимание на то, что вторая строка пробельная.
Вывод строк с определённым шаблоном
oleg@mobile:~/Directory:$ awk '/^P/' example.txt Peter Petrov 43 Berlin 600 Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$
Команды выбрала в нашем файле, две строки, начинающиеся с буквы P , а символом стрелки вверх ^ было указано начало строки.
Можно также вывести строки, заканчивающиеся определённым шаблоном:
oleg@mobile:~/Directory:$ awk '/0$/' example.txt Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$
Эту команду также можно изменить следующим образом:
oleg@mobile:~/Directory:$ awk '! /0$/' example.txt fristName lastName age city ID Sidor Sidorov 52 Sofia N/A Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$
Теперь были выведены строки не заканчивающиеся на 0 , так как символ ! используется как NOT.
Использование регулярных выражений
Для вывода слов, содержащих определённые буквы, соответствующие указанному шаблону, используется слеш / . Например, для вывода слов, содержащих Pa , выполняется следующее:
oleg@mobile:~/Directory:$ awk ' /Pa/' examle.txt Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$
В выводе мы получили все строки, содержащие Pa .
Использование операторов сравнения
Для получения, например, всей информации о сотрудниках моложе 35 лет оператор сравнения используются следующим образом:
oleg@mobile:~/Directory:$ awk ' /Pa/' examle.txt Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$
Команда показала в выводе всех сотрудников моложе 35 лет.
Заключение
Здесь были изложены лишь основы работы в Linux с командой awk . Теперь зная их вы сможете углублять свои навыки работы с этой очень мощной утилитой.