как сравнить два файла, используя только одно поле в строке и выводя разницу и подобное

#bash #shell

#bash #оболочка

Вопрос:

У меня возникла проблема при сравнении выходных данных всех файлов passwd и shadow и при выводе как одинаковых, так и разных, используя только поле username

Я использую команду grep

пока это мой код

 grep -f shadowfile.txt passwordfile.txt > same.txt
grep -Fxvf shadowfile.txt passwordfile.txt > diff.txt
  

Я ожидал, что same.txt чтобы иметь всех пользователей, но не иметь записи в diff one

Комментарии:

1. Опубликуйте несколько примеров файлов с ожидаемым результатом.

Ответ №1:

Способ, который я знаю, — использовать команду comm

 awk -F':' '{ print $1 }' passwordfile.txt | sort > passwordfile.sorted
awk -F':' '{ print $1 }' shadowfile.txt | sort > shadowfile.sorted

comm -12 passwordfile.sorted shadowfile.sorted > same.txt
comm -3 a1 a2 passwordfile.sorted shadowfile.sorted | sed 's/[ t]*//' > diff.txt
  

Команда comm требует, чтобы входные данные были отсортированы первыми
Я использовал команду awk и sort для создания отсортированного списка имен пользователей во временных файлах

И, для diff.txt , sed в трубе предназначен для удаления зазоров и выступов с выхода

Ответ №2:

вы можете использовать эти команды:

 awk -F : '{print $1}' passwd.txt shadow.txt |sort | uniq -u > diff.txt
awk -F : '{print $1}' passwd.txt shadow.txt |sort | uniq -d > same.txt
  

Комментарии:

1. как бы мне сделать так, чтобы он просто выполнял поиск и использовал имя пользователя в качестве параметра?

2. сначала он печатает пользователей обоих файлов, а затем сортирует их. Первая команда uniq -u печатает только уникальные файлы и uniq -d печатает только повторяющиеся.

3. и если я хочу распечатать полный путь, но использовать имя пользователя как способ проверки того, что у обоих одинаковое имя пользователя

4. что вы подразумеваете под полным путем?