Мне нужно найти все домашние каталоги пользователей, перечисленные с помощью grep из / etc / passwd

8

У меня есть вопрос, похожий на другой на этом сайте, где человек должен был найти список всех пользователей, использующих grep или awk из / etc / passwd. Это сработало для меня, но я попытался перевести его, чтобы найти и перечислить домашние каталоги. Я уже знаю, что вы не можете сделать это в одну строку, поэтому я знаю, что я бы использовал конвейер. Я провел онлайн-исследование, но не могу понять, в чем проблема. Если я использую grep и сделаю что-то вроде следующего:

   grep -oE '^[/*/]$' /etc/passwd 

... это, вероятно, выдаст мне ошибку, или покажет мне файлы / bin / bash, а это не то, что мне нужно. Мне просто нужны имена пользователей и их домашние каталоги, перечисленные с помощью grep! Я также не уверен, будет ли * отображать другие косые черты в виде символов, так как некоторые домашние каталоги имеют больше, чем просто два / (косые черты).

NarinderRSharma
источник
3
Кроме того, /etc/passwdможет или не может быть, где все пользователи. Учтите также getent passwd.
Чт

Ответы:

10

Grep на самом деле не инструмент для анализа данных таким образом, grep больше подходит для сопоставления с образцом, а вы пытаетесь выполнить обработку текста. Вы хотели бы использовать awk.

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

awk Команда

-F":" Устанавливает разделитель данных на:

$7 == "/bin/false" Проверяет, является ли 7-й столбец данных / bin / false

{print "User: "$1 "Home Dir: "$6}' Говорит распечатать первый и шестой столбцы в указанном формате.

/etc/passwd Файл, который мы обрабатываем

Захари Брейди
источник
Я не слишком люблю awk. Не могли бы вы объяснить, что именно -F: и '{print $ 1 "" $ 6}' делают точно?
Нариндерсшарма
Я обновил свой ответ, чтобы ответить на ваш вопрос
Захари Брэди
да, посмотрите, когда я это сделаю, он все еще показывает мне шифрование пароля, UID GIDS, какой тип оболочки мы используем. Мне нужно это просто напечатать пользователей, и они домашние каталоги, ничего больше. используя grep или awk, конечно.
Нариндерсшарма
когда я использую следующее: grep -oE '^[^:]+' /etc/passwdэто дает мне только пользователей, которые мне нужны, чтобы сделать что-то подобное или что-то подобное, чтобы иметь домашние каталоги с собой
NarinderRSharma
1
Можем ли мы увидеть образец (обфусцированную) строку из вашего и т. Д. Passwd? Это не звучит так, как будто это разделено, или если это так, то оно не выложено нормально.
Захари Брэди
18

Вы можете использовать cutдля разделения файлов со столбцами по определенному разделителю:

cut -d: -f6 /etc/passwd

Или -f1,6для столбцов (полей) 1 и 6.

Стефано Палаццо
источник
4
Простые инструменты, которые делают одну работу и делают это хорошо. Плюс один!
fd0
1

Как уже отмечали другие, grepэто не лучший инструмент для этого. Если вы настаиваете на его использовании, и если вы grepподдерживаете -o(печатать только совпадающую часть строки) и -P(используйте регулярные выражения, совместимые с Perl), вы можете сделать это:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

Обратите внимание, что это будет печатать всех пользователей, включая пользователей системы. Я показываю только 4 строки в качестве примера.

Это напечатает имя пользователя и домашние каталоги всех пользователей, но в отдельных строках. Затем вам нужно объединить каждую пару строк, чтобы собрать их вместе:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

объяснение

Регулярное выражение состоит из двух частей, оно ищет ^[^:]+OR (вот что |значит) .*:\K[^:]+(?=:[^:]+). Первый ищет один или несколько не :символов из начала строки. Это соответствует имени пользователя. Вторая часть ищет как можно больше символов до a :( .*:), а затем отбрасывает их (вот что \Kделает), чтобы они не печатались. Затем он соответствует строке non-, за :которой следует :и non- :. (?=foo)Конструкция называется положительным опережением и способ сопоставления символов после шаблона , не включая эти символы в самой игре.

Команда perlзаменит символы новой строки на :и пробелы, если номер текущей строки $.делится на 2. Итак, каждая вторая строка.

Тердон
источник
Perl может выполнять всю работу с помощью «awk-mode», perl -naf: -e 'print $F[0]." : ".$F[5].$/'поэтому sed 'N;s/\n/ : /'может быть лучшим партнером grep -oP.
dave_thompson_085
0

Я считаю, что вы можете сделать это с помощью «cut», используя только один двоичный файл, избегая каналов, достигая тех же результатов, что и другие ответы, но более элегантным способом :), например так:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

Если вы хотите, чтобы вывод был лучше отформатирован + в алфавитном порядке, вот, но компромисс заключается в том, что вы должны использовать больше двоичных файлов:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail
ivanleoncz
источник