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

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

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

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

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

6 ответов

Решение

Это должно работать для вас, используя подстановку процессов с помощью 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

Это покажет строки, присутствующие в file2, но не в file1. (Обратите внимание на порядок аргументов)

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

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

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

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

Другие вопросы по тегам