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


8

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

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.