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