Команда uniq в linux

Обновлено: 05.07.2024

Подробное объяснение команд инструментов awk, sort и uniq в оболочке

Каталог статей

инструменты awk

Формат команды, используемый awk, одинарные кавычки и фигурные скобки "<>" используются для установки действий по обработке данных. Awk может обрабатывать целевой файл напрямую или читать сценарий через «-f» для обработки целевого файла.

awk option ‘mode or condition ’ file 1 file 2 // фильтровать и выводить содержимое файла condition

awk -f script file file 1 file 2 // вызвать инструкции редактирования из сценария, фильтровать и выводить содержимое

Awk имеет тенденцию разделять строку на несколько «полей», а затем обрабатывать ее, и по умолчаниюРазделитель полей - пробел или табуляция. Результат выполнения awk можно распечатать и отобразить с помощью функции печати. В процессе использования команды awk вы можете использовать логический оператор «&&», что означает «и», «||» означает «или», а «!» Означает «нет»; вы также можете выполнять простые математические операции, такие как +, -, *, /,%, ^ представляют собой сложение, вычитание, умножение, деление, остаток и степень соответственно.

Используйте команду awk, чтобы узнать имя пользователя, идентификатор пользователя, идентификатор группы и другие столбцы / etc / passwd


Awk считывает информацию из входного файла или стандартного ввода.Как и sed, информация считывается построчно. Разница в том, что awk рассматривает строку в текстовом файле как запись и рассматривает определенную часть (столбец) в строке как поле (домен) в записи. Awk заимствует метод, аналогичный позиционным переменным в оболочке, используя $ 1, $ 2, $ 3 . для последовательного указания различных полей в строке (записи). Кроме того, awk использует $ 0 для обозначения всей строки (записи). Указываются разные поля Разделение символов. Разделителем по умолчанию для awk является пробел. Awk позволяет вам указать разделитель в виде «-F разделитель» в командной строке.

Схема принципа работы awk:


Awk содержит несколько специальных встроенных переменных (которые можно использовать напрямую) следующим образом:

FS: укажите разделитель полей для каждой строки текста, по умолчанию используется пробел или позиция табуляции (табуляция).

NF: количество полей в текущей обрабатываемой строке. // Ссылается на столбец

NR: номер строки (порядковый номер) строки, обрабатываемой в данный момент. // Относится к строке

$ 0: все содержимое строки текущей обрабатываемой строки.

$ n: n-е поле (n-й столбец) текущей обрабатываемой строки.

FILENAME: имя обрабатываемого файла.

RS: разделение записей данных, по умолчанию - \ n, то есть по одной записи на строку.

Операционная команда записывается внутри фигурных скобок <>, вне скобок, в одинарных кавычках

Вывести все нечетные строки


Вывести все четные строки

Вывод нечетных / четных строк awk является абсолютным

Выходные нечетные / четные строки Sed являются относительными

1. Вывод текста построчно

// Выводим весь контент, эквивалентный cat test.txt


// Выводим весь контент, эквивалентный cat test.txt


awk ‘NR 1,NR 3’ test.txt

// Выводим содержимое с первой по третью строки


// Выводим содержимое с первой по третью строки


awk ‘NR 1||NR 3’ test.txt

// вывод первой и третьей строк


// Выводим содержимое всех нечетных строк


// Выводим содержимое всех четных строк


// Выводим строки, начинающиеся с корня


awk ‘/nologin$/’ /etc/passwd

// выводим строки, заканчивающиеся на nologin


awk ‘BEGIN ; //bin/bash$/;END ’ /etc/passwd

// Подсчитываем количество строк, заканчивающихся на / bin / bash, что эквивалентно grep -c "/ bin / bash $" / etc / passwd


// Подсчитываем количество абзацев текста, разделенных пустыми строками


2. Вывод текста по полю

// Выводим третье поле в каждой строке (разделенное пробелами или табуляцией)


// Выводим первое и третье поля в каждой строке


// Выводим теневую запись пользователя, пароль которого пуст



// Выводим теневую запись пользователя, пароль которого пуст



// Выводим первое поле строки через двоеточие, а седьмое поле содержит / bash


" Означает: include, ключ для включения должен использовать "" двойные кавычки.

// Выводим первое и второе поля строки, которая содержит 8 полей, а первое поле содержит nfs


// Выводим все строки, в которых седьмое поле не соответствует ни / bin / bash, ни / sbin / nologin


3. Вызов команд оболочки через конвейер и двойные кавычки.

// Вызов команды wc -l для подсчета количества пользователей, использующих bash, что эквивалентно grep -c "bash $" / etc / passwd


// Вызов команды w и ее использование для подсчета количества онлайн-пользователей


// Вызов имени хоста и вывод текущего имени хоста



// Вызов имени хоста и вывод текущего имени хоста

инструмент сортировки (сортировка)

sort - это инструмент для сортировки содержимого файлов в единицах строк, а также его можно сортировать по разным типам данных. Например, сортировка данных и символов отличается.

Синтаксис команды сортировки:

Обычно используемые варианты включают:

-f: игнорировать регистр

-b: игнорировать пробелы перед каждой строкой

-M: Сортировать по месяцам

-n: сортировать по номеру

-r: обратная сортировка

-u: эквивалент uniq, что означает, что отображается только одна строка с одинаковыми данными

-t: указать разделитель, использовать [Tab] для разделения по умолчанию

-o <выходной файл>: выгрузить отсортированные результаты в указанный файл

-k: указать область сортировки

1. Сортировать по первой букве (та же первая буква будет сравнивать вторую букву)

Отсортируйте учетные записи в файле / etc / passwd: sort / etc / passwd


2. Сортировка по знаку и обратная сортировка

Отсортируйте третий столбец в файле / etc / passwd в обратном порядке: sort -t ‘:’ -rk 3 / etc / passwd


3. Отсортируйте и сохраните как файл.

Отсортируйте третий столбец в файле / etc / passwd и сохраните вывод в файл user.txt.

sort -t ‘:’ -k 3 /etc/passwd -o user.txt



инструмент uniq (дедупликация)

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

Команда uniq предназначена для поиска одинаковых строк в массивах текста. При этом с найденными совпадениями пользователь может совершать множество действий — например, удалять их из вывода либо наоборот, выводить только их.

Работа команды осуществляется как с текстовыми файлами (в том числе, записями скриптов), так и с текстом, напечатанным в командной строке терминала.

Синтаксис uniq

Запись команды осуществляется следующим образом:

$ uniq опции файл_источник файл_для_записи

Файл источник указывает откуда надо читать данные, а файл для записи - куда писать результат. Но их указывать не обязательно. В примерах мы будем набирать текст, который нуждается в редактировании, прямо в командную строку терминала, воспользовавшись ещё одной командой — echo, и применив к ней опцию -e. Это будет выглядеть так:

echo -e [текст, слова в котором разделены управляющей последовательностью\\n] | uniq

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

Опции uniq

У команды uniq есть такие основные опции:

  • -u (--unique) — выводит исключительно те строки, у которых нет повторов.
  • -d (--repeated) — если какая-либо строка повторяется несколько раз, она будет выведена лишь единожды.
  • -D — выводит только повторяющиеся строки.
  • --all-repeated[=МЕТОД] — то же самое, что и -D, но при использовании этой опции между группами из одинаковых строк при выводе будет отображаться пустая строка. [=МЕТОД] может иметь одно из трех значений — none (применяется по умолчанию), separate или prepend.
  • --group[=МЕТОД] — выводит весь текст, при этом разделяя группы строк пустой строкой. [=МЕТОД] имеет значения separate (по умолчанию), prepend, append и both, среди которых нужно выбрать одно.

Вместе с основными опциями могут применяться дополнительные. Они нужны для более тонких настроек работы команды:

  • -f (--skip-fields=N) — будет проведено сравнение полей, начиная с номера, который следует после указанного вместо буквы N. Поля — это слова, хотя, называть их словами в прямом смысле слова нельзя, ведь словом команда считает любую последовательность символов, отделенную от других последовательностей пробелом либо табуляцией.
  • -i (--ignore-case) — при сравнении не будет иметь значение регистр, в котором напечатаны символы (строчные и заглавные буквы).
  • -s (--skip-chars=N) — работает по аналогии с -f, однако, игнорирует определенное количество символов, а не строк.
  • -c (--count) — в начале каждой строки выводит число, которое обозначает количество повторов.
  • -z (--zero-terminated) — вместо символа новой строки при выводе будет использован разделитель строк NULL.
  • -w (--check-chars=N) — указание на то, что нужно сравнивать только первые N символов в строках.

Примеры использования uniq

Прежде всего следует отметить главную особенность команды uniq — она сравнивает только строки, которые находятся рядом. То есть, если две строки, состоящие из одинакового набора символов, идут подряд, то они будут обнаружены, а если между ними расположена строка с отличающимся набором символов — то не будут поэтому перед сравнением желательно отсортировать строки с помощью sort. Без задействования файлов uniq работает так:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq


После команды uniq можно использовать её опции. Вот пример вывода, где не просто удалены повторы, но и указано количество одинаковых строк:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -c


Теперь применим команду к тексту, который находится в файле.

uniq --all-repeated=prepend text-example.txt


Как можно заметить, глядя на снимок экрана, команда вывела в качестве повторяющихся только вторую и третью группу строк.


Причина этого — незаметный глазу символ пробела, который стоит в конце одной из строк первой группы. Нужно быть предельно внимательным при использовании uniq, чтобы получить качественный результат.

Используемая опция --all-repeated=prepend выполнила свою работу — добавила пустые строки в начало, в конец и между группами строк. Теперь попробуем сравнить только первые 5 символов в каждой строке.

echo -e небо исполосовано молниями\\nоблака на небе\\nоблака разогнал ветер\\nоблака закрыли солнце\\nсолнце светит ярко\\nзвезды кажутся огромными | uniq -w5


Как видно на скриншоте, повторяющиеся строки, которые начинались словом «облака», были удалены. Осталась только первая из них. Вывод только уникальных строк с использованием опции -u выглядит так:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -u


Чтобы проигнорировать определенное количество символов в начале одинаковых строк, воспользуемся опцией --skip-chars. В данном случае команда пропустит слово «облака», сравнив слова «перистые» и «белые».

echo -e небо\\nоблака перистые\\nоблака перистые\\nоблака белые\\nсолнце\\nзвезды | uniq --skip-chars=6


А вот наглядная демонстрация отличий при использовании опции --group с разными значениями. both добавило пустые строки как перед текстом, так и после него, а также между группами строк.

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq --group=both

Тогда как append не добавило пустую строку перед текстом:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq --group=append


Выводы

Команда uniq linux пригодится тем, кто часто и много работает с массивами текста, не имея возможности вычитывать их самостоятельно. Следует заметить, что не все версии uniq работают исправно, поэтому иногда результат выдачи может отличаться от ожидаемого.

Свои вопросы относительно использования команды, а также замечания и пожелания оставляйте в комментариях.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оригинал: Linux Uniq Command Tutorial for Beginners (10 examples)
Автор: Himanshu Arora
Дата публикации: 23 мая 2017 г.
Перевод: А.Панин
Дата перевода: 24 мая 2017 г.

Если вы являетесь пользователем интерфейса командной строки Linux и ваша работа связана с редактированием текстовых файлов, вы должны знать (если уже не знаете) о существовании огромного количества утилит с интерфейсом командной строки, которые могут помочь вам в различных ситуациях. Например, одной из таких утилит является утилита uniq , выводящая или удаляющая из вывода повторяющиеся строки, находящиеся в текстовом файле.

В данной статье мы будем обсуждать методику использования утилиты uniq на основе простых для понимания примеров. Но перед тем, как приступить к рассмотрению примеров стоит упомянуть о том, что все примеры и инструкции из данной статьи были протестированы в системе Ubuntu 16.04 LTS.

Утилита uniq в Linux

Как уже говорилось ранее, утилита uniq осуществляет вывод или удаление из вывода повторяющихся строк. А это синтаксис соответствующей команды:

А это описание функций утилиты с ее страницы руководства: "Утилита осуществляет фильтрацию идентичных строк из ВХОДНОГО ФАЙЛА (или из стандартного потока ввода) и выводит информацию в ВЫХОДНОЙ ФАЙЛ (или стандартный поток вывода). При вызове без параметров идентичные строки объединяются в рамках первых найденных экземпляров строк."

Ниже приведен ряд примеров, которые помогут вам лучше понять принцип работы рассматриваемой утилиты.

1. Удаление повторяющихся строк из вывода

Предположим, что в нашем распоряжении имеется файл со следующими строками:


Несложно заметить, что каждая из строк повторяется. Теперь применим утилиту uniq по отношению к этому файлу и посмотрим, к чему это приведет.


2. Вывод информации о количестве дубликатов каждой из строк

Если вам нужно, вы можете использовать утилиту uniq для вывода информации о количестве повторений каждой из строк файла. Это может быть сделано с помощью параметра командной строки -c . Например, команда

будет генерировать следующий вывод:


Несложно заметить, что перед каждой из строк выводится число, соответствующее количеству ее повторений.

3. Вывод лишь повторяющихся строк

Для того, чтобы утилита uniq выводила лишь повторяющиеся строки, следует использовать параметр -D командной строки. Например, предположим, что файл с именем файл file1 теперь содержит дополнительную строку в конце (обратите внимание на то, что эта строка не повторяется).


Теперь при исполнении команды

будет генерироваться следующий вывод:


Как вы видите, параметр -D сообщает утилите uniq о необходимости вывода всех повторяющихся строк, включая их повторы. Для лучшей читаемости вы можете активировать режим вывода пустой строки после каждой из групп повторяющихся строк с помощью параметра --all-repeated .

Данный параметр требует от пользователя обязательного указания метода добавления разделителя. Строки могут добавляться к разделителю (то есть, пустой строке) с помощью метода prepend или разделяться с помощью него с помощью метода append . Например, в данном случае используется метод prepend .


Более того, если вам нужно, чтобы утилита выводила лишь по одному экземпляру каждой из повторяющихся строк, вы можете воспользоваться параметром -d . Это пример его использования:


Очевидно, что в выводе приводится лишь по одному экземпляру строки из каждой группы.

4. Пропуск начальных фрагментов строк

Иногда, в зависимости от ситуации, совпадение двух строк может быть установлено по совпадению определенных частей этих строк. Например, рассмотрим следующий файл:


Теперь предположим, что строки должны считаться совпадающими или не совпадающими на основании совпадения или несовпадения их вторых полей (то есть HTF или FF) и вам нужно сделать так, чтобы утилита uniq использовала такой же критерий сравнения, чего несложно добиться с помощью параметра командной строки -f .

Параметр -f требует от вас обязательной передачи числа, которое соответствует количеству полей, которые нужно пропустить. Например, в нашем случае мы передаем в качестве значения параметр -f значение 1, так как мы хотим, чтобы утилита uniq пропустила лишь первое поле:


Из вывода очевидно, что утилита uniq посчитала первую и третью строку повторяющимися исключительно на основе их вторых полей.

5. Вывод всех строк с разделением групп повторяющихся строк

При необходимости вывода всех строк с разделением групп повторяющихся строк с помощью пустой строки вы можете использовать параметр --group . Как и в случае описанного выше параметра --all-repeated , параметр --groups требует от пользователя обязательного указания позиции пустой строки ( prepend , append или both ).

Это пример использования рассматриваемого параметра:


Обратите внимание на параметр -f , который обсуждался в предыдущем разделе.

6. Вывод лишь не повторяющихся строк

Вы уже наверняка поняли, что утилита uniq по умолчанию выводит лишь повторяющиеся строки. Но если вам нужно, вы можете сообщить ей о необходимости вывода лишь не повторяющихся или уникальных строк. Это делается с помощью параметра командной строки -u .

В нашем случае команда будет выглядеть следующим образом:

Это пример ее использования:


Обратите внимание на параметр -f , который обсуждался в разделе 4.

7. Пропуск заданного количества символов в начале строк

В одном из предыдущих разделов мы обсуждали методику пропуска полей строк при использовании утилиты uniq. Однако, при необходимости вы можете сообщить утилите о необходимости пропуска не начальных полей, а начальных символов строк. Для доступа к соответствующей функции может использоваться параметр командной строки -s .

Например, предположим, что наш файл содержит следующие строки:


Теперь, если вы захотите, чтобы uniq пропустила первые 4 символа каждой строки перед их сравнением, вы сможете воспользоваться следующей командой:

А это приведенная выше команда в действии:


Несложно заметить, что четвертая строка (faq_forge) из оригинального файла была пропущена. Это объясняется тем, что после пропуска первых четырех символов третья и четвертая строки становятся идентичными для утилиты uniq и она выводит лишь первую из них.

8. Указание количества символов для сравнения

По аналогии с пропуском символов, вы можете сообщить утилите uniq о необходимости сравнения лишь заданного количества символов строк. Для этой цели вам придется использовать параметр командной строки -w .

Например, предположим, что файл содержит следующие строки:


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

Это приведенная выше команда в действии:


Так как первые три символа третьей и четвертой строк совпадают, эти строки считаются утилитой идентичными. По этой причине в выводе находится лишь третья строка.

9. Сравнение строк без учета регистра

По умолчанию утилита uniq осуществляет сравнение строк с учетом регистра символов. Однако, вы можете активировать режим сравнения строк без учета регистра символов с помощью параметра командной строки -i .

Например, предположим, что мы будем использовать файл с содержимым, аналогичным рассмотренному в предыдущем разделе, но теперь четвертая строка будет начинаться с символов H, O и W в верхнем регистре.


Теперь, если вы попытаетесь выполнить рассмотренную в предыдущем разделе команду, вы получите отличный вывод:


Это объясняется тем, что первые три символа третьей и четвертой строк отличны для утилиты uniq ввиду их регистра. В подобных ситуациях вы можете активировать режим сравнения строк без учета регистра с помощью параметра командной строки -i .


10. Использование завершающего нулевого символа вместо символа перехода на новую строку

По умолчанию утилита uniq генерирует вывод с завершающим символом перехода на новую строку. Однако, при необходимости вы можете активировать режим использования завершающего нулевого символа (полезный при вызове uniq из сценариев). Для этого следует использовать параметр командной строки -z :

Заключение

Мы рассмотрели практически все поддерживаемые утилитой uniq параметры командной строки, поэтому вам остается лишь самостоятельно испытать их в работе для того, чтобы лучше понять их принцип работы и функции. И как обычно, в случае каких-либо сомнений и вопросов следует обращаться к странице руководства утилиты .

Favorite

Добавить в избранное

Команда Uniq в Linux с примерами

Н аучитесь использовать команду uniq в Unix и Linux с этими практическими примерами.

Команда uniq в Unix и Linux используется для фильтрации дублированного текста. Она может использоваться сама по себе, но обычно используется вместе с другими командами, такими как определение избыточной информации в файле.

Вот синтаксис команды uniq:

Когда вы запускаете uniq без параметров, она будет использоваться с stdin и stdout для ввода и вывода.

Хотя использование stdin возможно при использовании буфера обмена (копирование/вставка), но это не самое практичное использование.

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

Одним из ограничений команды uniq является то, что она будет идентифицировать только дубликаты, которые находятся рядом друг с другом в файле. Это довольно просто, но позвольте нам показать вам пример, чтобы вы могли увидеть его в действии.

Таким образом, вы сразу знаете, что не можете доверять программе, чтобы идентифицировать каждый дубликат самостоятельно. Есть несколько способов обойти это, и обычно это происходит с помощью команды sort .

7 примеров команды uniq в Linux

Мы использовали настоящий системный журнал, но редактировали его для демонстрационных целей. Большая часть файла уже отсортирована в соседнем порядке, но мы оставили пару строк «не на своем месте», чтобы показать функциональность команды uniq.

Пример 1. Использование команды uniq по умолчанию

Хотя мы уже показали вам это, давайте посмотрим на наш пример файла с использованием синтаксиса по умолчанию.

Пример 2: Вывести отфильтрованные результаты в файл назначения

Вот содержимое выходного файла:

Этот вариант довольно понятен. Программа добавит счет в начало каждой строки.

Как видите, отображаются только строки, которые дублируются по всему файлу, если вы используете опцию -d команды uniq.

Здесь вы получите обратный вывод предыдущей команды. Ни одна из этих команд не повторяется в файле.

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

Каждый из них использует следующий синтаксис

Если вы хотите использовать команду uniq во втором столбце, вам придется пропустить первое поле следующим образом:

Как вы можете видеть, для одной и той же строки требуются «red fish» и «green fish», поскольку первое поле (с цветами) было проигнорировано. Если вы используете здесь опцию count, она покажет количество найденных уникальных строк:

Зачем вам это нужно? Мы дадим вам практический сценарий. Многие файлы журналов имеют временную метку в начале строк. Если вы хотите найти в таком файле только уникальные строки, вы можете пропустить первое поле с отметкой времени с параметром -f.

Точно так же вы можете пропустить определенное количество символов.

Если вы использовали файл журнала для предыдущих примеров, это нормально. Мы хотели сделать текст сравнения немного проще, чтобы избежать путаницы. Если нет, давайте вернемся назад и посмотрим, что произойдет, если вы используете только первые символы для поиска дубликатов.

Все строки, начинающиеся с «/usr», теперь обозначаются как «одинаковые» с точки зрения программы.

Это может оказаться полезным, если вы ищете конкретное событие журнала.

Бонус: избегайте неполных совпадений, используя «sort» и «uniq» одновременно.

Вы можете запускать эти команды отдельно для достижения того же эффекта, но если вы никогда не использовали конвейер (символ |) в Linux, это отличный способ узнать о них.

Вы можете использовать каналы для комбинирования различных команд, чтобы сэкономить нам нажатия клавиш и улучшить наш рабочий процесс. Команды будут выполняться в порядке их ввода.

Это пример ввода, который мы собираемся использовать:

Теперь давайте отсортируем входной файл и затем используем команду uniq. Команда sort переупорядочивает текст так, что все элементы сначала располагаются в соседнем порядке. Затем, когда команда uniq запущена, она находит только 3 уникальные строки в файле.

Каналы позволяют нам запускать несколько команд одновременно, но важно учитывать их порядок.

Обратите внимание, что содержимое файла остается неизменным так же, как и при отдельном запуске команд. Соединение двух команд вместе также сохраняет результаты в «памяти» системы. Если вы запускаете их отдельно, вы не сможете получить эти результаты, пока не создадите новый файл и не используете его для перезаписи содержимого оригинала перед выполнением второй команды.

Вывод

Как вы можете себе представить, это делает это важной концепцией в обучении bash. Эти конкретные команды (sort и uniq) часто используются вместе для быстрой фильтрации информации из больших файлов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

uniq — утилита Unix, с помощью которой можно вывести или отфильтровать повторяющиеся строки в файле. Если входной файл задан как («-») или не задан вовсе, чтение производится из стандартного ввода. Если выходной файл не задан, запись производится в стандартный вывод. Вторая и последующие копии повторяющихся соседних строк не записываются. Повторяющиеся входные строки не распознаются, если они не следуют строго друг за другом, поэтому может потребоваться предварительная сортировка файлов.

Использование

Опции программы имеют следующие значения:

-u Выводить только те строки, которые не повторяются на входе.

-d Выводить только те строки, которые повторяются на входе.

-c Перед каждой строкой выводить число повторений этой строки на входе и один пробел.

-i Сравнивать строки без учёта регистра.

-s число_символов

Игнорировать при сравнении первые число_символов символов каждой строки ввода. Если эта опция указана совместно с -f, то будут игнорироваться первые число_полей полей, а затем ещё число_символов символов. Символы также нумеруются начиная с единицы.

-f число_полей

Игнорировать при сравнении первые число_полей полей каждой строки ввода. Полем является строка непробельных символов, отделённая от соседних полей пробельными символами. Поля нумеруются начиная с единицы.

Команда uniq без опций

Если в тексте следует подряд несколько одинаковых строк, то команда uniq уменьшит их количество до одной.

Расшифрую этот пример. Команду echo, при помощи опции -e можно заставить печатать не в строчку, как обычно, а в несколько строк. Для этого нужно в конце каждой будущей строки поставить знак новой строки \n, а чтобы "экранировать" обратный слэш (\), который сам по себе тоже является знаком, нужно этот обратный слэш удвоить: \\, и получится \\n. Например, напечатаем в две строки какой-нибудь стишок, например:

(Кто не знает, сообщу по секрету, что великий пролетарский писатель Максим Горький в слове пингвин ставил ударение на первом слоге - пИнгвин). Пробел между знаком новой строки и первым словом следующей строки не ставится, иначе получится "лесенка":

как в стихах другого великого пролетарского поэта Маяковского:

Но довольно поэзии; вернемся к нашему числовому примеру:

Итак, в первой части этого программного канала команда echo -e, которая выводит на стандартный вывод столбик чисел. Вывод этот канализируется на ввод команды uniq, которая уменьшает количество одинаковых строк (1111) до одной.

Тут нужно уточнить очень интересную вещь: команда uniq сравнивает только рядом расположенные строчки, и если составить столбик цифр в другом порядке, скажем:

то никакого уменьшения числа повторов не произойдет. Становится понятным, что команда uniq любит уже отсортированные тексты, где все одинаковые строчки собраны вместе. Такой сортировкой славится команда sort, вот и добавим ее в наш программный канал:

Команда sort сортирует, команда uniq убирает повторы, кажется все прекрасно, если бы не одно "но" - у программы sort есть опция -u, которая справляется с этой задачей не хуже:

Получается, что команда uniq как бы и не нужна.

Не спешите с выводами, у команды uniq есть еще несколько опций, которых нет у команды sort.

Параметры uniq

Опция -c

Сообщит, сколько было одинаковых строк до их урезания:

Опция -d

Эта опция, наоборот, выведет лишь ту строку, которая повторялась в тексте:

Можно узнать и сколько раз эта строка повторялась:

Опция -D (расширение GNU)

Выведет все повторяющиеся строки, не уменьшая их числа:

На первый взгляд, это не слишком полезно, но в сочетании с некоторыми другими опциями вполне имеет смысл.

Опция -u

Выводит только уникальные строки:

Опция -f

Эта опция пропустит указанное ЧИСЛО "слов", прежде чем начать искать повторы. Тут следует пояснить, что "словом" команда uniq считает любую непрерывную последовательность символов, отделенную от других символов знаками пробела, либо табуляции (таковых знаков может быть один или больше).

В этом примере мы пропустили заведомо одинаковую фамилию, чтобы "отцедить" двойников Иванов. (Правда, безо всяких опций сработало бы не хуже, но в каких-то случаях, скорее всего, эта опция полезна).

Можно скомбинировать эту опцию с другими, слегка изменив синтаксис:

В таком виде она имеет определенный смысл.

Можно было задать эту опцию проще: uniq -1.

Опция -s

Эта опция пропустит необходимое ЧИСЛО символов, прежде начала поиска повторов.

Эту опцию можно комбинировать с другими, если записать без пробела между -s и ЧИСЛОМ:

Можно также ставить просто: uniq +3.

Опция -w

Позволяет сравнивать на уникальность указанное ЧИСЛО символов в каждой строке:

Работает эта опция и в сочетании с опциями пропуска слов или символов:

Опции --help и --version общеизвестны, останавливаться на них мы не будем.

Остается добавить, что команда uniq принимает в качестве аргументов не только файлы, которые проверяются на уникальность, но и файлы, куда результат проверки будет записан:

Команда uniq и символы кириллицы

Новые версии программы с русскими буквами работают адекватно (версия 5.97 с некоторыми опциями неадекватно обращалась с кириллицей; версия 6.4 никаких нареканий не вызывает).

Резюме команды uniq

Сырая и не самая необходимая команда (несмотря на маститых авторов: Richard Stallman и David MacKenzie). Следует обновить до новейшей версии, так как в версии 5.97 замечены ошибки. Для отбраковки одинаковых строк советую, вместо команды uniq, применять команду sort -u.

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