Simpler Navigation for Servers and Operating Systems - Please Update Your Bookmarks
Completed: a much simpler Servers and Operating Systems section of the Community. We combined many of the older boards, so you won't have to click through so many levels to get at the information you need. Check the consolidated boards here as many sub-forums are now single boards.
If you have bookmarked forums or discussion boards in Servers and Operating Systems, we suggest you check and update them as needed.
Languages and Scripting
Showing results for 
Search instead for 
Did you mean: 

checking for multiple user in /etc/passwd file.

Frequent Advisor

checking for multiple user in /etc/passwd file.




I need to check multiple user registered in server.



I have a basic script like :


for HOST in `cat hostlist`
echo "====================================================" >> ${HOMEDIR}/logfile.txt
echo "      "
echo "$HOST" >> ${HOMEDIR}/logfile.txt
ssh $HOST grep `cat username` /etc/passwd >> ${HOMEDIR}/logfile.txt
echo "====================================================="  >> ${HOMEDIR}/logfile.txt





I will be getting the username and hostlist from a file.




When I running for multiple user , I am getting error.


>>ssh $HOST grep `cat username` /etc/passwd >> ${HOMEDIR}/logfile.txt



ssh testhost grep ---> it is reading all username in the file as below.



ssh testhost grep user1 user2 /etc/passwd



i want to add -e to grep or need to know any other option is available or not ?





Bill Hassell
Honored Contributor

Re: checking for multiple user in /etc/passwd file.

There are several problems with the concept. First, grep must always be protected from finding the wrong matches. If you have a username of bill, then it will find every line where usernames like bill, billy, waybill, billh, etc are located, but worse, grep doesn't stop at the username -- it will match comments, even a home directory like /home/billing or /home/dashbill


So start by testing your grep locally. To match just the username (which always starts in column 1), anchor the search to the beginning of each line:


grep ^bill /etc/passwd


But that is not enough. grep will still find bill and billh which are not duplicates. So extend the search to the mandatory colon (:) at the end of the name, like this:


grep ^bill: /etc/passwd


Now for multiple matches, the -e works fine, or you an use egrep with extended regular expressions but I find the multiple bars and extra quotes a bit confusing read when checking scripts.  Here are both ways:


grep -e ^bill: -e ^joe: -e ^mary: -e ^jennifer: /etc/passwd

egrep  "^bill:|^joe:|^mary:|^jennifer:" /etc/passwd


Now creating a grep pattern list like this is a bit tricky but can be done.


So the question is:


Are you looking for duplicate user names or duplicate user ID numbers?

For duplicate usernames, you can do something like this:


cut -d: -f1 /etc/passwd | sort | uniq -c
cut -d: -f1 /etc/passwd | sort | uniq -c | grep -v " 1 "
(shows only duplicate usernames)



But to find duplicate user ID's (UID), just run:


logins -d





Bill Hassell, sysadmin
Dennis Handly
Acclaimed Contributor

Re: checking for multiple user in /etc/passwd file.



Should this be:




>for HOST in `cat hostlist`; do


To remove evil cats, change to:

for HOST in $(< $hostlist); do


If every output is to the same file, you can redirect the whole for loop:
   echo "===================================================="
   echo "$HOST"
   ssh $HOST grep $(< $username) /etc/passwd
done >> ${HOMEDIR}/logfile.txt


Note: The above grep is going to get ALL of the names on one line and that won't work.  You can use -f file but then that file must be on $HOST.  Bill mentioned creating multiple "-e name" patterns on the command line.  But it may be easier to just copy the /etc/passwd file back to this machine to process.


   scp $host:/etc/passwd passwd.${HOST}

   grep -f $username passwd.${HOST}


But based on Bill's comments, you should have the anchors already in $username:



You can of course process the original file and create a temp file with that format:

   sed -e 's/\(.*\)/^\1:/' $username > $username.tmp


>For duplicate usernames, you can do something like this:


Except for logins(1m), those cut(1) commands would work better on the passwd copied back to the source machine.

Frequent Advisor

Re: checking for multiple user in /etc/passwd file.



Thanks Bill and Dennis for suggestion.


from your comment , I can understand that ,in  username file i have to add -e


some thing like this



cat username


-e user1

-e user2


or I have to use some anchor .


but my requirement is , In username file it should be in the below format.


cat username










Dennis Handly
Acclaimed Contributor

Re: checking for multiple user in /etc/passwd file.

>In username file it should be in the below format.


My above post showed you how to use sed to change the file format.  A slight modification will add -e and anchors:

grep $(sed 's/\(.*\)/-e ^\1:/' $username) passwd.${HOST}