Как я получаю список пользователей, не присутствующих в файле CSV от/etc/passwd?

Я должен сравнить список пользователей (/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, но результат не то, в чем я нуждаюсь..

2
задан 17 February 2016 в 04:18

2 ответа

Комбинация 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 вывод для этих шаблонов.

4
ответ дан 2 December 2019 в 01:44

Не столь гладкий как решение 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 и виды выходной файл;

И другой способ использовать combinemoreutils пакет: 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;
2
ответ дан 2 December 2019 в 01:44

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

Похожие вопросы: