Linux List All Users In The System

I am a new Linux system administrator and I’m unable to find the command to list all users on my Linux server. What is the command to list users under Linux operating systems? How do I list users in Linux?

The /etc/passwd file contains one line for each Linux user account, with seven fields delimited by colons. This is a text file. You can easily list users under Linux using the cat command or other commands such as grep command/egrep command and more. This page describes various Linux commands to list all users on the Linux operating system, including Ubuntu, Debian, RHEL, Arch, Fedora, CentOS, and other distros.
Tutorial requirements
Operating system/appLinux
Root privileges requiredNo
DifficultyEasy (rss)
Estimated completion time2m
Table of contents

ADVERTISEMENTS

Linux list all users account using the /etc/passwd file

Type any one of the following command:
$ cat /etc/passwd
Sample outputs:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
....
..
...
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin

Each line in the file has seven fields as follows. For example, consider the following line:
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
Where,

  • vnstat – The user name or login name.
  • x – Encrypted password is stored in the /etc/shadow file.
  • 131 – UID (user ID number)
  • 137 – Primary GID (group ID number)
  • vnstat daemon – GECOS. It may includes user’s full name (or application name, if the account is for a program), building and room number or contact person, office telephone number, home telephone number and any other contact information.
  • /var/lib/vnstat – Home directory for the user.
  • /usr/sbin/nologin – Login shell for the user. Pathnames of valid login shells comes from the /etc/shells file.

How to list users in Linux using pagers

Of course we can use pagers such as more/less commands as follows to view the /etc/passwd file:
$ more /etc/passwd
$ less /etc/passwd

Sample outputs:

Centos / RHEL /  Fedora / Debian / Ubuntu Linux List Users Command

Fig.01: List users using /etc/passwd

All fields are separated by a colon (:) symbol. Total seven fields exists. The first field is username. It is used when user logs in. It should be between 1 and 32 characters in length. Of course we can limit outputs using the head command and tail command as follows:
tail -5 /etc/passwd
head -5 /etc/passwd

Linux list user names only

To list only usernames type the following awk command:
$ awk -F':' '{ print $1}' /etc/passwd
Sample outputs:

root
daemon
bin
sys
sync
games
man
lp
mail
news
....
..
..hplip
vivek
bind
haldaemon
sshd
mysql
radvd

Another option is to use the cut command:
$ cut -d: -f1 /etc/passwd

Get a list of all users using the getent command

To get a list of all Linux users you can type the following getent command:
$ getent passwd
$ getent passwd | grep tom
## get a list all users ##
$ getent passwd | cut -d: -f1
## count all user accounts using the wc ##
$ getent passwd | wc -l

One can use the compgen command on Linux to list users and other resources too:
$ compgen -u

Find out whether a user account exists in the Linux server

We can use above commands to see whether a user exists in the Linux machine as follows using the grep command:

compgen -u | grep vivek
getent passwd | grep -q sai && echo "User sai found" || echo "User sai not found"
compgen -u | grep -q ram && echo "User ram found" || echo "User ram not found"

A simplified command would be:

getent passwd {username}
getent passwd vivek

How to count user accounts in the Linux server

Want to get user accounts count on your system? Try the wc command as follows:
$ compgen -u | wc -l
$ getent passwd | wc -l

How To Linux List All Users Commands

A Note About System and General Users

Each user has numerical user ID called UID. It is defined in /etc/passwd file. The UID for each user is automatically selected using /etc/login.defs file when you use useradd command. To see current value, enter:
$ grep "^UID_MIN" /etc/login.defs
$ grep UID_MIN /etc/login.defs

Sample outputs:

UID_MIN			 1000
#SYS_UID_MIN		  100

1000 is minimum values for automatic uid selection in useradd command. In other words all normal system users must have UID >= 1000 and only those users are allowed to login into system if shell is bash/csh/tcsh/ksh etc as defined /etc/shells file. Type the following command to list all login users:

## get UID limit ##
l=$(grep "^UID_MIN" /etc/login.defs)
## use awk to print if UID >= $UID_LIMIT ##
awk -F':' -v "limit=${l##UID_MIN}" '{ if ( $3 >= limit ) print $1}' /etc/passwd

To see maximum values for automatic uid selection in the useradd command, enter:
$ grep "^UID_MAX" /etc/login.defs
Sample outputs:

UID_MAX			60000

In other words, all normal system users must have UID >= 1000 (MIN) and UID <= 60000 (MAX) and only those users are allowed to login into system if shell is bash/csh/tcsh/ksh as defined in the /etc/shells file. Here is an updated code to get details:

## get mini UID limit ##
l=$(grep "^UID_MIN" /etc/login.defs)
 
## get max UID limit ##
l1=$(grep "^UID_MAX" /etc/login.defs)
 
## use awk to print if UID >= $MIN and UID <= $MAX   ##
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max ) print $0}' /etc/passwd

Sample outputs:

vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
jwww:x:504:504::/htdocs/html:/sbin/nologin
wwwcorp:x:505:505::/htdocs/corp:/sbin/nologin
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh

/sbin/nologin is used to politely refuse a login i.e. /sbin/nologin displays a message that an account is not available and exits non-zero. It is intended as a replacement shell field for accounts that have been disabled or you do not want user to login into system using ssh. To filter /sbin/nologin, enter:

#!/bin/bash
# Name: listusers.bash
# Purpose: List all normal user accounts in the system. Tested on RHEL / Debian Linux to List All Users on Linux
# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+
# -----------------------------------------------------------------------------------
_l="/etc/login.defs"
_p="/etc/passwd"
 
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
 
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
 
## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin   ##
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max  && $7 != "/sbin/nologin" ) "$_p"

Sample outputs:

vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh

Finally, this script lists both system and users accounts:

#!/bin/bash
# Name: listusers.bash
# Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux
# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+
# -----------------------------------------------------------------------------------
_l="/etc/login.defs"
_p="/etc/passwd"
 
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
 
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
 
## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin   ##
echo "----------[ Normal User Accounts ]---------------"
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max  && $7 != "/sbin/nologin" ) print $0 }' "$_p"
 
 
 
echo ""
echo "----------[ System User Accounts ]---------------"
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( !($3 >= min && $3 <= max  && $7 != "/sbin/nologin")) print $0 }' "$_p"

Sample outputs:

----------[ Normal User Accounts ]---------------
vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh


----------[ Linux List All Users (System User Accounts) ]---------------
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
memcached:x:498:496:Memcached daemon:/var/run/memcached:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

Conclusion

You learned how to get a list of users in Linux machine. We can use the getent, cat, more, cut and other commands to fetch list of user accounts on a Linux system. See how to check list of users in Unix and man pages as follows:
man 5 passwd
man getent
man cut
man awk
help compgen

🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source/DevOps topics:
CategoryList of Unix and Linux commands
File Managementcat
FirewallCentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNCentOS 8 Debian 10 Firewall Ubuntu 20.04

ADVERTISEMENTS
25 comments… add one
  • John Eisenhower Apr 10, 2012 @ 0:02

    I would change it to `cat /etc/passwd | grep -v nologin` which gives a clearer view into which users can actually login and execute.

    • 🐧 nixCraft Apr 10, 2012 @ 14:09

      Thanks for the feedback! The faq has been updated with more info.

    • Carlos Ruiz Jul 17, 2013 @ 19:19

      This is one of the most common mistakes of unexperimented people on UNIX-like utilities. Instead of ‘cat $file | grep $pattern’ you should use ‘grep $pattern $file’ which is much clearer and allows for easier sudoing.

      Nevertheless, I’ll take note of the ‘nologin’ advice. Thanks!

      • JOhn Doe Jan 27, 2017 @ 8:49

        “Instead of cat $file | grep $pattern you should use grep $pattern $file ”
        I’m one more mistaken user :)

  • Claudio Nanni Apr 10, 2012 @ 17:16

    I would also have a look at:

    last
    lastb
    lastlog

    quite interesting commands on users activity on a host.

    Claudio

  • marc May 4, 2012 @ 7:07

    ldap enviroment, whats about:
    # getent passwd |egrep -v ‘nologin|false’
    i recommend this to get a userlist

  • maarten May 22, 2012 @ 17:35

    The ldap and nis scenarios for centralized login administration are omitted here.

    The local passwd file may be just the tip of the login iceberg if either of those is set in
    /etc/nsswitch.conf

    For example:
    # ypcat passwd
    would be the common command if nis is set up.

  • Luís Pedro Algarvio May 22, 2013 @ 0:31

    new version, with columns

    #!/bin/bash
    # Name: listusers.bash
    # Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux
    # Author: Vivek Gite , under GPL v2.0+
    # https://www.cyberciti.biz/faq/linux-list-users-command/
    # -----------------------------------------------------------------------------------
    _l="/etc/login.defs"
    _p="/etc/passwd"
    
    ## get mini UID limit ##
    l=$(grep "^UID_MIN" $_l)
    
    ## get max UID limit ##
    l1=$(grep "^UID_MAX" $_l)
    
    ## use awk to print if UID >= $MIN and UID = min && $3 = min && $3 <= max  && $7 != "/sbin/nologin" ) printf "%-15s %-5s %-5s %-25s %-10sn", $1, $3, $4, $6, $7 }' "$_p"
    
    echo ""
    
    ## use awk to print if UID  $MAX                                    ##
    echo "----------------------------[ System User Accounts ]---------------------------"
    printf "%-15s %-5s %-5s %-25s %-10sn" "Login" "UID" "GID" "Home" "Shell"
    echo "-------------------------------------------------------------------------------"
    #awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( !( $3 >= min && $3 = min && $3 <= max  && $7 != "/sbin/nologin" ) ) printf "%-15s %-5s %-5s %-25s %-10sn", $1, $3, $4, $6, $7 }' "$_p"
    
  • Luís Pedro Algarvio May 22, 2013 @ 0:32

    and a group list script

    #!/bin/bash
    # Name: listgroups.bash
    # Purpose: List all normal user and system groups in the system. Tested on RHEL / Debian Linux
    # Author: Vivek Gite , under GPL v2.0+
    # https://www.cyberciti.biz/faq/linux-list-users-command/
    # -----------------------------------------------------------------------------------
    _l="/etc/login.defs"
    _g="/etc/group"
    
    ## get mini GID limit ##
    l=$(grep "^GID_MIN" $_l)
    
    ## get max GID limit ##
    l1=$(grep "^GID_MAX" $_l)
    
    ## use awk to print if GID >= $MIN and GID = min && $3 = min && $3 <= max ) printf "%-15s %-5s %-10sn", $1, $3, $4 }' "$_g"
    
    echo " "
    
    ## use awk to print if GID  $MAX                                    ##
    echo "-----------------------------[ System User Groups ]----------------------------"
    printf "%-15s %-5s %-10sn" "Group" "GID" "Logins"
    echo "-------------------------------------------------------------------------------"
    #awk -F':' -v "min=${l##GID_MIN}" -v "max=${l1##GID_MAX}" '{ if ( !( $3 >= min && $3 = min && $3 <= max ) ) printf "%-15s %-5s %-10sn", $1, $3, $4 }' "$_g"
    
  • Luís Pedro Algarvio May 22, 2013 @ 0:34

    humm looks like it got cut.

    drop me an email and ill send both scripts

  • theresa May 29, 2013 @ 8:56

    hi there,

    great script, really helps me a lot, and it’s also very well documented! great work!

    however, since i’m a newbie when it comes to shell scripting, how do I direct the output from stdout into a file?
    I’ve found something like this:
    2>&1 | tee -a users.txt

    but somehow this doesn’t quite work :(

    any help would be appreciated!

    thanks!

    • Tyler Jun 14, 2013 @ 3:17

      Redirect the output to a file with the first command and then append the second command output:

      ## use awk to print if UID >= $MIN and UID  /tmp/userlist
      awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 > /tmp/userlist
       
      echo "" >> /tmp/userlist
      echo "----------[ System User Accounts ]---------------" >> /tmp/userlist
      awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( !($3 >= min && $3 > /tmp/userlist
      
  • rk Sep 8, 2013 @ 3:09

    can some body help me with the following question?

    Find the number of users on your system whose user ids are greater than 8?

  • Liviu Sep 13, 2013 @ 7:55

    Thanks. Short and to the point.

  • Sanchit Mar 19, 2014 @ 14:58

    Can even use this!
    cat /etc/passwd | grep “/home/” | awk -F’:’ ‘{ print $1}’

    • Martin Mar 2, 2015 @ 19:06

      Thanks for this!

  • rahul kumar Apr 21, 2014 @ 16:47

    how can see only system users in linux using command

  • Robert Nix Jun 9, 2014 @ 12:53

    Note that none of this accounts for systems using an external source for its users. If you are using ldap or (gasp!) Active Directory to source your users, then listing /etc/passwd will not yield the desired results, as you won’t see the bulk of your users.

    The command we use, insted of “cat /etc/passwd”, is “getent passwd”, which returns the combined list of users from /etc/passwd (local users) and other sources. The getent command will give you a more realistic view of your users, on any system you encounter.

    • BobH Nov 5, 2014 @ 18:45

      Could you show how I would use your command in the final script as posted by the original poster? I think that is the issue I’m having where it is only showing the users with Local Authentication, not AD Users (yes ack.. AD).

      Thanks,
      Bob

  • aaron Apr 16, 2015 @ 8:12

    Excellent explanation and script of list users in linux! Congrats Mate!
    Aaron

  • Harsh Jain May 7, 2015 @ 11:26

    Thanks for detailed tutorial.

    I configured the VNC as per given step. How to access the same GUI from host machine as we accessing from VNC client.

  • anonymous Mar 5, 2016 @ 0:33

    Regular user accounts:
    cat /etc/passwd | grep ":[0-9][0-9][0-9][0-9]:"

    System user accounts:
    1) without “nologin”
    cat /etc/passwd | egrep ":[0-9][0-9][0-9]:|:[0-9][0-9]:|:[0-9]:" | egrep - v 'nologin|false'
    2) with “nologin”
    cat /etc/passwd | egrep ":[0-9][0-9][0-9]:|:[0-9][0-9]:|:[0-9]:"

    OR (if you like a separate, clean UIDs listing of one, two or three digits):

    cat /etc/passwd | grep ":[0-9]:"
    cat /etc/passwd | grep ":[0-9][0-9]:"
    cat /etc/passwd | grep ":[0-9][0-9][0-9]:"

  • anonymous Mar 5, 2016 @ 23:50

    I actually improved this a little bit; here are some useful aliases which you can put in the ~/.bashrc file:

    # 'getus'           # Get REGULAR Users
    # 'getsysus' 	# Get SYSTEM Users
    # 'getgr' 	       # Get USER Groups
    # 'getsysgr' 	# Get SYSTEM Groups
    # 'getwheel'     # Get WHEEL's Users
    alias getus='getent passwd | egrep ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]"'
    alias getsysus='getent passwd | egrep -v ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]"'
    alias getgr='getent group | egrep ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]"'
    alias getsysgr='getent group | egrep -v ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]"'
    alias getwheel='getent group | grep ^wheel'
    
    Also if you like to 'egrep' the 'nologin' out of 'getsysus' and 'getsysgr' above, here you go:
    getsysus | egrep -v nologin
    getsysgr | egrep -v nologin
    
    Or, simply add them altogether on the above aliases like so:
    alias getsysus='getent passwd | egrep -v ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]|nologin"'
    alias getsysgr='getent group | egrep -v ":[0-9][0-9][0-9][0-9]:|[0-9][0-9][0-9][0-9][0-9]|nologin"'
    
  • j2 Jul 19, 2020 @ 15:04

    Latest systemd concept : dynamic user !!!

    Dynamic user are created at the service start and destroy at the stop. They exist only in systemd process and are enable by the “systemd” service in nsswitch.conf.

    Fortunately “getent passwd” lists them. So “getent” is the privilegied command to list user.

    To have only dynamic users : “getent -s systemd passwd

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.