Введение
В среде Linux сравнение файлов является обычной задачей для системных администраторов и разработчиков. Команда comm представляет собой мощный инструмент, позволяющий пользователям сравнивать две отсортированные текстовые файлы построчно и определять уникальные и общие строки между ними.
В этом практическом занятии (лабораторной работе) LabEx вы научитесь использовать команду comm для анализа текстовых файлов. Вы узнаете, как создавать тестовые файлы, сравнивать их содержимое и извлекать конкретную информацию из результатов сравнения. По завершении этого практического занятия вы будете хорошо понимать, как использовать эту универсальную команду для задач сравнения файлов в Linux.
Подготовьте свои текстовые файлы
Перед тем, как мы сможем использовать команду comm, нам нужно создать несколько примеров текстовых файлов для работы. На этом этапе мы создадим два текстовых файла, содержащих списки распространенных команд Linux.
Сначала создадим рабочую директорию для организации наших файлов:
mkdir -p ~/project/comm-lab
cd ~/project/comm-lab
Теперь создадим наш первый текстовый файл с именем commands1.txt со списком команд Linux:
echo -e "ls\ncd\npwd\nmkdir\ntouch\ncomm\nsed\nawk" | sort > commands1.txt
Эта команда выполняет следующие действия:
echo -eвыводит текст с интерпретацией экранированных символов (\nсоздает новые строки)- Список команд передается (через конвейер
|) в командуsortдля сортировки элементов в алфавитном порядке - Отсортированный вывод затем перенаправляется (
>) в файл с именемcommands1.txt
Создадим второй текстовый файл с именем commands2.txt со списком команд, несколько отличающимся от предыдущего:
echo -e "ls\ncd\npwd\ncomm\ngrep\nfind\nsed" | sort > commands2.txt
Для проверки правильности создания наших файлов мы можем использовать команду cat для просмотра их содержимого:
cat commands1.txt
Вы должны увидеть следующий вывод:
awk
cd
comm
ls
mkdir
pwd
sed
touch
Теперь проверим содержимое второго файла:
cat commands2.txt
Вы должны увидеть:
cd
comm
find
grep
ls
pwd
sed
Обратите внимание, что некоторые команды встречаются в обоих файлах (например, cd, ls, pwd, comm, sed), в то время как другие уникальны для каждого файла. Эта настройка позволит нам продемонстрировать различные возможности команды comm на следующих этапах.
Использование базовой команды comm
Теперь, когда у нас есть отсортированные текстовые файлы, мы можем изучить базовое использование команды comm. Команда comm сравнивает две отсортированные файлы построчно и выводит три столбца:
- Строки, уникальные для первого файла
- Строки, уникальные для второго файла
- Строки, общие для обоих файлов
Запустим базовую команду comm для сравнения наших двух файлов:
cd ~/project/comm-lab
comm commands1.txt commands2.txt
Вы должны увидеть вывод, похожий на следующий:
awk
cd
comm
find
grep
ls
mkdir
pwd
sed
touch
На первый взгляд вывод может показаться запутанным, но он имеет определенный формат:
- Столбец 1 (без табуляции в начале строки): Строки, присутствующие только в
commands1.txt(awk,mkdir,touch) - Столбец 2 (одна табуляция в начале): Строки, присутствующие только в
commands2.txt(find,grep) - Столбец 3 (две табуляции в начале): Строки, общие для обоих файлов (
cd,comm,ls,pwd,sed)
Этот вывод по умолчанию позволяет сразу увидеть все различия и сходства, но из-за форматирования с использованием табуляций он может быть трудно читаемым. На следующем этапе мы узнаем, как сделать этот вывод более полезным с помощью опций команды comm.
Скрытие столбцов с помощью опций команды comm
Вывод команды comm по умолчанию может быть трудно читаемым из-за его столбчатого формата. К счастью, comm предоставляет опции для сокрытия определенных столбцов, что упрощает извлечение только нужной вам информации.
Опции следующие:
-1: Скрыть столбец 1 (строки, уникальные для первого файла)-2: Скрыть столбец 2 (строки, уникальные для второго файла)-3: Скрыть столбец 3 (строки, общие для обоих файлов)
Эти опции можно комбинировать, чтобы отобразить только данные, которые вас интересуют.
Поиск строк, уникальных для первого файла
Чтобы отобразить только строки, которые уникальны для первого файла (commands1.txt), мы используем опции -2 и -3 для сокрытия столбцов 2 и 3:
cd ~/project/comm-lab
comm -23 commands1.txt commands2.txt
Вывод:
awk
mkdir
touch
Это команды, которые встречаются только в commands1.txt.
Поиск строк, уникальных для второго файла
Аналогично, чтобы отобразить только строки, которые уникальны для второго файла (commands2.txt), мы используем опции -1 и -3:
comm -13 commands1.txt commands2.txt
Вывод:
find
grep
Это команды, которые встречаются только в commands2.txt.
Поиск общих строк
Чтобы отобразить только строки, которые общие для обоих файлов, мы используем опции -1 и -2:
comm -12 commands1.txt commands2.txt
Вывод:
cd
comm
ls
pwd
sed
Это команды, которые встречаются в обоих файлах.
Сохранение результатов в файлы
Часто полезно сохранить эти результаты в отдельные файлы для дальнейшего использования или обработки. Давайте сделаем это:
comm -23 commands1.txt commands2.txt > unique_to_file1.txt
comm -13 commands1.txt commands2.txt > unique_to_file2.txt
comm -12 commands1.txt commands2.txt > common_lines.txt
Проверим содержимое этих новых файлов:
echo "Contents of unique_to_file1.txt:"
cat unique_to_file1.txt
echo "Contents of unique_to_file2.txt:"
cat unique_to_file2.txt
echo "Contents of common_lines.txt:"
cat common_lines.txt
Вывод покажет строки, уникальные для каждого файла, и общие строки, как мы видели в предыдущих командах.
Эти методы полезны для сравнения конфигурационных файлов, поиска различий между версиями файла или идентификации общих элементов между наборами данных.
Практические примеры использования команды comm
Теперь, когда вы понимаете базовое использование команды comm, давайте рассмотрим несколько практических примеров, демонстрирующих ее полезность в реальных сценариях.
Пример 1: Поиск новых записей
Представьте, что у вас есть два списка пользователей - один за прошлую неделю и один за сегодня. Вы хотите определить, какие пользователи являются новыми (добавлены с прошлой недели).
Создадим эти файлы:
cd ~/project/comm-lab
echo -e "user1\nuser2\nuser3\nuser4\nuser5" | sort > users_last_week.txt
echo -e "user1\nuser3\nuser5\nuser6\nuser7\nuser8" | sort > users_today.txt
Чтобы найти новых пользователей (в users_today.txt, но не в users_last_week.txt):
comm -13 users_last_week.txt users_today.txt
Вывод:
user6
user7
user8
Пример 2: Поиск удаленных записей
Используя те же файлы, давайте найдем, какие пользователи были удалены с прошлой недели:
comm -23 users_last_week.txt users_today.txt
Вывод:
user2
user4
Пример 3: Комбинирование команды comm с другими командами
Команду comm можно комбинировать с другими командами для более сложных операций. Например, если мы хотим подсчитать, сколько общих команд есть в наших исходных файлах:
comm -12 commands1.txt commands2.txt | wc -l
Эта команда передает общие строки в команду wc -l, которая подсчитывает количество строк.
Вывод:
5
Это показывает, что есть 5 команд, общих для обоих файлов.
Пример 4: Использование команды comm с несортированными файлами
Команда comm требует отсортированных входных файлов. Если вы попытаетесь использовать ее с несортированными файлами, вы можете получить неверные результаты. Давайте продемонстрируем это:
echo -e "cat\nls\npwd\ncd" > unsorted1.txt
echo -e "ls\ncat\ngrep\npwd" > unsorted2.txt
Если мы попытаемся использовать comm напрямую:
comm unsorted1.txt unsorted2.txt
Вывод может быть вводящим в заблуждение, так как файлы не отсортированы. Правильный подход - сначала отсортировать файлы:
comm <(sort unsorted1.txt) <(sort unsorted2.txt)
В этом случае используется подстановка процессов для сортировки файлов на лету перед их сравнением. Вы должны увидеть правильно отформатированный результат с правильными столбцами.
Эти примеры демонстрируют универсальность команды comm для сравнения текстовых файлов в различных сценариях, таких как отслеживание изменений, поиск различий и фильтрация данных.
Резюме
В этом практическом занятии (лабораторной работе) вы научились использовать команду comm в Linux для сравнения текстовых файлов и выявления различий между ними. Вот краткое резюме того, что вы достигли:
- Создали отсортированные текстовые файлы для сравнения с использованием базовых команд Linux.
- Использовали базовую команду
commдля сравнения двух файлов и поняли ее трехстолбчатый формат вывода. - Применили опции сокрытия столбцов (
-1,-2,-3) для извлечения определенной информации:- Строки, уникальные для первого файла.
- Строки, уникальные для второго файла.
- Строки, общие для обоих файлов.
- Сохранили результаты сравнения в отдельные файлы для дальнейшего использования.
- Исследовали практические примеры использования
commв реальных сценариях:- Поиск новых записей в обновленных списках.
- Определение удаленных записей.
- Комбинирование
commс другими командами для более сложных операций. - Корректная обработка несортированных файлов.
Команда comm - это мощный инструмент для сравнения текстовых файлов в Linux. Она позволяет системным администраторам, разработчикам и аналитикам данных эффективно выявлять различия и сходства между файлами, что является важным для таких задач, как управление конфигурацией, контроль версий и анализ данных.
Понимание того, как эффективно использовать comm и ее опции, повысит вашу продуктивность при работе с текстовыми файлами в среде командной строки Linux.



