Сравните два списка пользователей в 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
чтобы работать должным образом, вам, вероятно, нужно сначала отсортировать его.