Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to display users under a group in a line for each user in Linux bash

Tags:

linux

bash

sed

awk

tr

Currently when I run a grep command on a visitors group that I had created

grep visitors:x:1011: /etc/group

This is a sample result of the above command, as the actual result is too long.

visitors:x:1011:ellipsiscoterie,magnetcommonest,wizardmeans,beakskeletal,lemonwellmade,ralphpaperclips etc..

How do I display the above result as shown below (without visitors:x:1101 and separating the commas), as I have difficulty doing so.

ellipsiscoterie
magnetcommonest
wizardmeans
beakskeletal
lemonwellmade
ralphpaperclips
like image 357
Mikail Nicholas Avatar asked Oct 19 '21 05:10

Mikail Nicholas


People also ask

How can I see the members of a user group?

Hit Windows+R, type “lusrmgr. msc” into the Run box, and then hit Enter. In the “Local Users and Groups” window, select the “Users” folder, and then double-click the user account you want to look at. In the properties window for the user account, switch to the “Member Of” tab.

What command displays the group memberships for a user?

To display the members of a group, or the groups to which a user belongs, use the pts membership command.

How do I see all users and groups in Linux?

In order to list users on Linux, you have to execute the “cat” command on the “/etc/passwd” file. When executing this command, you will be presented with the list of users currently available on your system. Alternatively, you can use the “less” or the “more” command in order to navigate within the username list.


5 Answers

I suggest using sed instead of grep

sed -n -e 's/^visitors\:x\:1011\://p' /etc/group | tr ',' '\n'

UPD: detailed explain of sed part is here. tr examples you can find here

like image 121
Pavel Sapezhka Avatar answered Oct 21 '22 16:10

Pavel Sapezhka


Using awk, you can set the field separated to a colon using -F: and check if the string starts with visitors:x:1011:

As the comma separated values always seems to be at the end, split the last field $NF on a comma and loop the splitted values.

awk -F: '
/^visitors:x:1011:/ {
  count=split($NF, ary, ",");
  for(i=1; i<=count; i++) print ary[i];
}' /etc/group
like image 37
The fourth bird Avatar answered Oct 21 '22 17:10

The fourth bird


With your shown samples please try following awk program.

awk -F':' '/^visitors:x:1011/ && NF==4{gsub(/,/,ORS,$4);print $4}' /etc/group

OR in case entry visitors:x:1011 comes only once in your file then try following:

awk -F':' '/^visitors:x:1011/ && NF==4{gsub(/,/,ORS,$4);print $4;exit}' /etc/group

Explanation: Simple explanation would be, making field separator as : for all lines. Then in main program, checking condition if line starts from visitors:x:1011 and number of fields are 4 then globally substitute comma with new line(ORS) in 4th field and print it.



OR if line with visitors:x:1011 comes once and 4th field is NULL(means no entry present which is obvious in some cases) and you want to print message for it then try following:

awk -F':' '/^visitors:x:1011/ && NF==4{if($4==""){print "NO entry found in /etc/group"} else{gsub(/,/,ORS,$4);print $4};exit}' /etc/group

like image 27
RavinderSingh13 Avatar answered Oct 21 '22 17:10

RavinderSingh13


A good approach to query groups and users is making use of the getent command as it also works on ldap systems.

$ getent group visitors | cut -d: -f4 | tr ',' '\n'

On standard systems this will always work as usernames and groupnames cannot contain the <comma>-character or the <colon>-character. (If you have a non-standard Linux or Unix system, see man useradd and man groupadd to check the username and group name rules)

If you want to use awk instead of this little pipeline, then an elegant—but cryptic—version would read:

$ getent group visitors | awk -F: '{FS=",";OFS=ORS;$0=$4;$1=$1}1'
like image 32
kvantour Avatar answered Oct 21 '22 18:10

kvantour


One option could be to use awk:

awk -F: '$1 == "visitors" {
    size = split($4, users, ",");
    for(i=1; i<=size; ++i) print users[i];
    exit }' /etc/group
  • -F: - Use : as the field separator
  • $1 == "visitors" - If the first field matches visitors execute the following statement (within { ... })
  • size = split($4, users, ","); - Split the 4:th field on , and store the result in the array users. Returns the number of elements in users and puts that in size.
  • The for loop - Loop over all the elements in users and print them out.
  • exit - Terminate awk - There's no need to continue reading the rest of the file.
like image 22
Ted Lyngmo Avatar answered Oct 21 '22 17:10

Ted Lyngmo