Назад | Перейти на главную страницу

Сравните два списка пользователей в bash

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

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

cat /etc/passwd | cut --fields=1 | sort -k1.2

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

Это должно сработать для вас, используя подстановку процесса с помощью bash, diff, awk и sort:

diff <(awk -F: '{print $1}' /etc/passwd | sort) <(sort your_other_list_file)

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

comm -3 <((cut -f1 -d: / etc / passwd | sort)) <(sort file2)

Мне это нравится больше всего, это однострочник, избегает awk и comm дает вам возможность предоставить вам записи, уникальные для list1, list2 или общие для обоих. Кроме того, обрезка перед сортировкой позволяет сортировать более короткие строки, с которыми можно работать, поэтому для более длинных списков это может быть быстрее.

Допустим, ваш плоский файл выглядит так:

data info username number status

Тогда вы могли бы сделать это:

join -v 1 -1 1 -2 3 <(sed 's/:/ /g' /etc/passwd | sort) <(sort your_file) >> your_file

Это добавляет строки, которые появляются в первом файле (-v 1), которые не появляются во втором файле до конца второго файла. Поля для сопоставления - это поле 1 для файла один и поле 3 для файла два. В sed Команда компенсирует разделение файла паролей двоеточием и разграничение плоского файла пробелами. Вы можете настроить номера полей и разделители в соответствии со своими потребностями.

Вы можете легко увидеть, какие строки отсутствуют от одного файла к другому с помощью grep:

fgrep -vxf file1 file2

Он покажет строки, присутствующие в файле2, но не в файле1. (Обратите внимание на порядок аргументов)

Как насчет использования diff? Просто выполните diff file_a file_b и вы получите файл сравнения со всеми изменениями. После этого вы можете просто отфильтровать + чтобы получить недостающие строки.

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

cat /etc/passwd1 | cut -d':' -f1 | sort > passwd_file1
cat /etc/passwd2 | cut -d':' -f1 | sort > passwd_file2
diff passwd_file1 passwd_file2

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