🐹 Bash: Выбираем нужные строки из файла с помощью sed, head и tail.

Содержание:

1. Введение.
2. Практические примеры.
3. Оригиналы источников информации.


1. Введение.

Тому, кто пишет много скриптов bash, часто приходится выбирать нужные строки из текста, например готовые блоки кода.

2. Практические примеры.

Имеется просто файл с некоторым количеством строк внутри:

# cat somefile.txt

Ответ:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

2.1. К примеру нам надо вывести первые четыре строки из файла.

Это очень просто сделать при помощи команды head:

# head -4 somefile.txt

Ответ:

Line 1
Line 2
Line 3
Line 4

Для более сложных задач, например, извлечь вторую строку и третью строку из того же файла, команда head не подходит.

2.2. Если применить команду p (print), то можно дублировать указанную номером строку:

# sed 3p somefile.txt

Ответ:

Line 1
Line 2
Line 3
Line 3
Line 4
Line 5
Line 6
Line 7

Обратите внимание, что редактор печатает весь файл, причем указанную третью строку печатает дважды. Почему? По умолчанию редактор перепечатывает на стандартный вывод каждую строку вводимого файла. Четко заданная команда 3p приказывает печатать третью строку. В итоге третья строка дублируется.

2.3. Чтобы этого не происходило дублирования строки, следует подавить вывод по умолчанию при помощи опции -n, чтобы на выводе был только результат команды 3p.

Выведем только третью строку из файла:

# sed -n 3p somefile.txt

Ответ:

Line 3

2.4. Можно пойти другим путем и удалить из файла все строки, кроме пятой строки:

# sed '5!d' somefile.txt

или вот так:

# head -n 5 somefile.txt | tail -n 1

Ответ:

Line 5
  • где '5!d' означает: если строка не является первой (!), то подлежит удалению.

Обратите внимания на 'кавычки' (одинарные). Они совершенно необходимы, так как без них конструкция 5!d вызовет последнюю запускавшуюся в командной строке команду, начинающуюся с буквы d.

2.5. Для извлечения нескольких строк, например, с третьей строки по шестую строку, можно поступить одним из следующих способов:

# sed -n 3,6p somefile.txt

или

# sed '3,6!d' somefile.txt

Ответ будет одинаковый:

Line 3
Line 4
Line 5
Line 6

Интервал обозначается через запятую включительно.

2.6. Если строки не идут друг за другом, например, со второй строки по четвертую строку и еще шестую строку?

# sed -n -e 2,4p -e 6p somefile.txt

Ответ:

Line 2
Line 3
Line 4
Line 6

3. Оригиналы источников информации.

  1. linuxcommando.blogspot.com «Using sed to extract lines in a text file».
  2. rus-linux.net «Выбираем нужные строки из файла с помощью sed».

Читайте также: