Командная строка Linux
Шрифт:
[me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | head
me:x:1001:1001:Myself,,,:/home/me:/bin/bash
root:x:0:0:root:/root:/bin/bash
dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false
hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false
klog:x:103:104::/home/klog:/bin/false
messagebus:x:108:119::/var/run/dbus:/bin/false
polkituser:x:110:122:PolicyKit,,,:/var/run/PolicyKit:/bin/false
pulse:x:107:116:PulseAudio daemon,,,:/var/run/pulse:/bin/false
Определив
uniq — выявление или удаление повторяющихся строк
В сравнении с sort программа uniq более легковесна. Она решает, казалось бы, тривиальную задачу. Когда ей передается сортированный файл (в том числе и стандартный ввод), она удаляет повторяющиеся строки и выводит результат в стандартный вывод. Она часто используется в сочетании с sort для удаления повторяющихся строк.
ПРИМЕЧАНИЕ
Даже при том что uniq — инструмент, традиционный для Unix, который часто используется вместе с sort, GNU-версия sort поддерживает параметр -u, удаляющий повторяющиеся строки из сортированных результатов.
Давайте создадим текстовый файл для последующих экспериментов:
[me@linuxbox ~]$ cat > foo.txt
a
b
c
a
b
c
Не забудьте ввести CTRL+D, чтобы завершить ввод с клавиатуры. Если теперь применить uniq к нашему текстовому файлу, результат ничем не будет отличаться от оригинала; повторяющиеся записи никуда не исчезли:
[me@linuxbox ~]$ uniq foo.txt
a
b
c
a
b
c
Чтобы uniq действительно выполнила свою работу, исходные данные нужно сначала отсортировать:
[me@linuxbox ~]$ sort foo.txt | uniq
a
b
c
Это объясняется тем, что uniq удаляет повторяющиеся записи, только если они следуют друг за другом.
uniq имеет несколько параметров. Наиболее часто используемые из них перечислены в табл. 20.2.
В следующем примере используется параметр -c программы uniq для определения числа повторяющихся строк в исходном текстовом файле:
[me@linuxbox ~]$ sort foo.txt | uniq -c
2 a
2 b
2 c
Таблица 20.2. Часто используемые параметры команды uniq
Параметр
Описание
– c
Вывести список повторяющихся строк, предваряя их
– d
Вывести только повторяющиеся, не уникальные строки
– f n
Пропустить n начальных полей в каждой строке. Деление на поля производится по пробельным символам, как в программе sort; однако, в отличие от sort, программа uniq не имеет параметра для настройки альтернативного разделителя полей
– i
Сравнивать строки без учета регистра символов
– s n
Пропустить n начальных символов в каждой строке
– u
Вывести только уникальные строки. Подразумевается по умолчанию
Нарезка и перетасовка текста
Далее мы обсудим три программы, которые используются для выделения колонок текста из файлов и их компоновки различными способами.
cut — удаление фрагментов из всех строк в файлах
Программа cut используется для извлечения фрагментов текста из строк и вывода их в стандартный вывод. Она может принимать имена файлов в аргументах или данные со стандартного ввода.
Определение фрагментов строк, подлежащих извлечению, реализовано не очень удобно, и для этой цели применяются параметры, перечисленные в табл. 20.3.
Таблица 20.3. Параметры команды cut для выбора фрагментов
Параметр
Описание
– c список_символов
Извлекает фрагмент строки, определяемый списком_символов. Список может включать один или несколько числовых диапазонов, разделенных запятыми
– f список_полей
Извлекает одно или несколько полей из строки, как определено аргументом список_символов. Список может включать одно или несколько полей или диапазонов полей, разделенных запятыми
– d символ_разделитель
В присутствии параметра -f в качестве разделителя полей используется символ_разделитель. По умолчанию поля должны отделяться друг от друга одним символом табуляции
– -complement
Извлекает строку текста целиком, кроме фрагментов, определяемых параметром -c и/или -f
Как видите, программа cut не обладает особенной гибкостью. Она лучше всего подходит для извлечения фрагментов из текста, произведенного другими программами, а не человеком. Давайте вернемся к нашему файлу distros.txt и посмотрим, достаточно ли он «хорош» для программы cut. Если воспользоваться программой cat с параметром -A, можно увидеть, отвечает ли файл требованию в отношении использования символа табуляции в качестве разделителя полей.
[me@linuxbox ~]$ cat -A distros.txt