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 show below (without visitors:x:1101 and seperating the commas), as i have difficulty doing so.
ellipsiscoterie
magnetcommonest
wizardmeans
beakskeletal
lemonwellmade
ralphpaperclips
CodePudding user response:
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
CodePudding user response:
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 matchesvisitors
execute the following statement (within{
...}
)size = split($4, users, ",");
- Split the 4:th field on,
and store the result in the arrayusers
. Returns the number of elements inusers
and puts that insize
.- The
for
loop - Loop over all the elements inusers
and print them out. exit
- Terminateawk
- There's no need to continue reading the rest of the file.
CodePudding user response:
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 <semi-colon>-character. (If you have a non-standard linux or Unix system, see man useradd
and man groupadd
to check the username and groupname rules)
CodePudding user response:
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
CodePudding user response:
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