Я должен сравнить список пользователей (/etc/passwd
) в .csv файл учетной записи и получают учетную запись от /etc/passwd
это не находится в моем файле CSV.
/etc/passwd
шоу:
root:x:0:0:root:/root:/bin/bash
albert:x:521:521:auto:/home/albert:/bin/bash
alfred:x:521:521:auto:/home/alfred:/bin/bash
.csv
шоу файла:
albert,abc123
Ожидаемый вывод:
root
alfred
Я попробовал в течение 2 дней awk и grep, но результат не то, в чем я нуждаюсь..
Комбинация grep
, tr
, cut
и замена процесса:
cut -d: -f1 /etc/passwd | grep -xvFf <(tr ',' '\n' < file.csv)
Эти cut
команда получает имена пользователей от /etc/passwd
(первое :
- разграниченное поле).
Затем эти tr
команда преобразовывает Ваши поля CSV в одно имя пользователя на строку.
команда grep затем ищет все строки (-x
), которые не соответствуют (-v
) никакие фиксированные шаблоны (-F
) из файла, содержащего шаблоны, один на строку (-f
). Мы используем замену процесса (<()
) для использования tr
вывод для этих шаблонов.
Не столь гладкий как решение muru, но другой способ использовать comm
, tr
и cut
и sort
:
comm -13 <(<file tr ',' '\n' | sort) <(cut -d ':' -f 1 /etc/passwd | sort)
comm -13 <(<file tr ',' '\n' | sort) <(cut -d ':' -f 1 /etc/passwd | sort)
: сравнивает строки в выводе <file tr ',' '\n' | sort
и cut -d ':' -f 1 /etc/passwd | sort
и печать только строки, уникальные для cut -d ':' -f 1 /etc/passwd | sort
;<file tr ',' '\n' | sort
: чтения STDIN от file
, переводит запятые в новые строки и сортирует выходной файл;cut -d ':' -f 1 /etc/passwd | sort
: печатает первое разделенное от двоеточия поле каждой строки в /etc/passwd
и виды выходной файл;И другой способ использовать combine
(в moreutils
пакет: sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
), который позволяет сохранять несколько sort
команды (хотя, скорее всего, combine
сортирует файлы внутренне так или иначе):
combine <(cut -d ':' -f 1 /etc/passwd) NOT <(<file tr ',' '\n')
combine <(cut -d ':' -f 1 /etc/passwd) NOT <(<file tr ',' '\n')
: сравнивает строки в выводе cut -d ':' -f 1 /etc/passwd
и <file tr ',' '\n'
и печать только строки, уникальные для cut -d ':' -f 1 /etc/passwd
;<file tr ',' '\n'
: чтения STDIN от file
и переводит запятые в новые строки;cut -d ':' -f 1 /etc/passwd
: печатает первое разделенное от двоеточия поле каждой строки в /etc/passwd
;