Tôi cần tìm tất cả các thư mục nhà của người dùng được liệt kê bằng grep từ / etc / passwd


8

Tôi có một câu hỏi tương tự như một câu hỏi khác trên trang web này, nơi cá nhân phải tìm danh sách tất cả người dùng sử dụng grep hoặc awk từ / etc / passwd. Điều đó làm việc cho tôi nhưng tôi đã thử dịch nó để tìm và liệt kê các thư mục chính của chúng. Tôi đã biết bạn không thể làm điều đó trong một dòng vì vậy tôi biết tôi sẽ sử dụng một đường ống dẫn. Tôi đã thực hiện nghiên cứu trực tuyến của mình nhưng tôi không thể tìm ra vấn đề là. Nếu tôi sử dụng grep và làm một cái gì đó như sau:

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

... nó có thể sẽ gây ra lỗi cho tôi hoặc nó cũng sẽ hiển thị cho tôi các tệp / bin / bash không phải là thứ tôi muốn. Tôi chỉ cần tên người dùng và thư mục nhà của họ được liệt kê bằng grep! Tôi cũng không chắc chắn * sẽ hiển thị các dấu gạch chéo khác dưới dạng ký tự hay không, vì một số thư mục chính có nhiều hơn chỉ hai / '(dấu gạch chéo).


3
Ngoài ra, /etc/passwdcó thể hoặc không thể là nơi tất cả người dùng đang ở. Cũng xem xét getent passwd.
thrig

Câu trả lời:


10

Grep thực sự không phải là công cụ để phân tích dữ liệu theo cách này, grep dành cho việc khớp mẫu và bạn đang cố gắng xử lý văn bản. Bạn sẽ muốn sử dụng awk.

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

awk Lệnh

-F":" Đặt dấu phân cách dữ liệu thành:

$7 == "/bin/false" Kiểm tra nếu cột dữ liệu thứ 7 là / bin / false

{print "User: "$1 "Home Dir: "$6}' Nói để in cột đầu tiên và cột thứ sáu trong định dạng được chỉ định.

/etc/passwd Là tập tin chúng tôi đang xử lý


Tôi không quá thích awk, bạn có thể giải thích chính xác những gì -F: và '{print $ 1 "" $ 6}' làm gì không?
NarinderRSharma

Tôi đã cập nhật câu trả lời của mình để trả lời câu hỏi của bạn
Zachary Brady

vâng, hãy xem cho tôi khi tôi làm điều đó, nó vẫn hiển thị cho tôi mã hóa mật khẩu, UID GIDS chúng ta đang sử dụng loại vỏ nào. Tôi cần nó để chỉ in người dùng và họ là thư mục nhà, không có gì khác. sử dụng grep hoặc awk tất nhiên.
NarinderRSharma

Khi tôi sử dụng như sau: grep -oE '^[^:]+' /etc/passwdđiều đó mang lại cho tôi chỉ những người dùng tôi cần phải sắp xếp thứ gì đó tương tự hoặc một cái gì đó tương tự để có các thư mục nhà ở đó với họ
NarinderRSharma

1
Chúng tôi có thể thấy một dòng mẫu (bị xáo trộn) từ mật khẩu vv của bạn không? Nó không giống như nó: được phân định hoặc nếu có, nó không được đặt ra bình thường.
Zachary Brady

18

Bạn có thể sử dụng cutđể phân chia các tệp với các cột trên một dấu phân cách cụ thể:

cut -d: -f6 /etc/passwd

Hoặc -f1,6cho các cột (trường) 1 và 6.


4
Các công cụ đơn giản làm một công việc và làm nó tốt. Cộng với một!
fd0

1

Như những người khác đã chỉ ra, grepkhông phải là công cụ tốt nhất cho việc này. Nếu bạn khăng khăng sử dụng nó và nếu bạn grephỗ trợ -o(chỉ in phần phù hợp của dòng) và -P(sử dụng Biểu thức chính quy tương thích Perl), bạn có thể làm điều này:

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

Lưu ý rằng điều này sẽ in tất cả người dùng, bao gồm cả người dùng hệ thống. Tôi chỉ hiển thị 4 dòng làm ví dụ.

Điều đó sẽ in tên người dùng và thư mục nhà của tất cả người dùng nhưng trên các dòng riêng biệt. Sau đó, bạn cần nối từng cặp dòng để kết hợp chúng lại với nhau:

$ 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

Giải trình

Regex có hai phần, nó tìm kiếm ^[^:]+OR (nghĩa là gì |) .*:\K[^:]+(?=:[^:]+). Đầu tiên tìm kiếm một hoặc nhiều :ký tự không phải từ đầu dòng. Điều này phù hợp với tên người dùng. Phần thứ hai tìm kiếm càng nhiều ký tự càng tốt cho đến khi một :( .*:) và sau đó loại bỏ chúng (đó là những gì \Knó làm) để chúng không được in. Sau đó, nó khớp với một chuỗi không- :được theo sau :và không :. Cấu (?=foo)trúc này được gọi là giao diện tích cực và là cách khớp các ký tự sau một mẫu mà không bao gồm các ký tự đó trong chính khớp.

Các perllệnh sẽ thay thế dòng mới với :và không gian nếu số dòng hiện tại ( $.) chia hết cho 2. Vì vậy, mỗi dòng thứ hai.


perl có thể thực hiện toàn bộ công việc với 'awk-mode' perl -naf: -e 'print $F[0]." : ".$F[5].$/'để sed 'N;s/\n/ : /'có thể trở thành đối tác tốt hơn grep -oP.
dave_thndry_085

0

Tôi tin rằng bạn có thể làm điều này với "cắt", chỉ sử dụng một nhị phân, tránh các đường ống, đạt được kết quả tương tự như các câu trả lời khác, nhưng theo cách thanh lịch hơn :), như thế này:

$ 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
....

Nếu bạn muốn có một đầu ra được định dạng tốt hơn + thứ tự bảng chữ cái, thì đây là, nhưng sự đánh đổi là vậy, bạn phải sử dụng nhiều nhị phân hơn:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.