Sorting group information for accounts


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sorting group information for accounts
# 1  
Old 07-31-2012
Sorting group information for accounts

I have an input file that contains the primary and secondary groups a user should have based on a pre-defined role. The input file looks like this:

Code:
<user_login>|<comment_field>|<role>

After I execute my script to do some grepping I have the following user file where the secondary groups are defined by the role:

Code:
<user_login>|<dir_path_set_by_role>|<shell_set_by_role>|<primary_GID>|<secondary_GID>|<secondary_GID>|<secondary_GID>|...

The problem I have is that GID's must be resolved to their group name and then have the corresponding users added to an upload file that would look like your typical group entry:

Code:
<group_name>:x:<GID>:<user_1>,<user_2>,<user_3>,...

I need to sort and uniq the GID file, grep the GID in the output file to see which users require that GID, and then append them to the group upload entry. I don't know if this is necessary but I put I'm using a few temp files to store output and I'm at the part where I have all the sorted and uniq'd groups in a temp file. What I need to do is grep the GID through the user file and then append that user to the upload file where each match of the group would replace user_1, respectively. So, if my user file looked like this:
Code:
jon|/home/managers|/bin/ksh|1573|1893|4907|6135|
mike|/home/managers|/bin/ksh|1573|4907|1530||
marsha|/home/employees|/bin/ksh|739|1893||

my upload file would look like this (the GID's are translated to group names):
Code:
managers:x:1573:jon,mike
folder_1:x:1893:jon,marsha
folder_2:x:4907:jon,mike
folder_3:x:6135:jon
folder_4:x:1530:mike
employee_folder_1:x:739:marsha
employee_folder_2:x:1839:marsha,jon

Can you help me setting up the group upload file?
# 2  
Old 07-31-2012
how are the GID's translated? does the output file already exist and need to be amended? or is it a separate input file. is it the same format without any users then?
# 3  
Old 07-31-2012
For the GID translation I simply "getent group | cut -d: -f1,3 > groups" and then I grep the GID in the groups file. It has to be this way due to circumstances beyond my control.

The output file could possibly be amended with the entries of the group upload file (sorry for the "file" terminologies). I don't see any reason why that would be a problem but if it was I could easily find a delimiter and cut them back into separate files. I think it would be ideal for them to be separate files because the system accepting group modifications in bulk will only accept input in the manner I have specified (group:x:gid:user1,user2,user3,<etc>). It would be the same format without any users however I don't believe any grep of the GID's in the user file would not return a result. But it's ok if there's an entry that's just: group:x:gid:
# 4  
Old 07-31-2012
Code:
#!/usr/bin/awk -f

#firstly bring in this systems group entries
BEGIN {
        FS=OFS=":"
        cmd="getent group"
        while ((cmd | getline) > 0) {
                g_idx[g_idx_max++]=$3   #preserve order
                #create new line,excluding any users-- group:x:gid:
                group[$3]=$1 OFS $2 OFS $3 OFS
                g_cnt[$3]=0
        }
        FS="|"
}

{
        for (i=4;i<=NF;i++) {
                if (!length($i)) continue
                if (!($i in group)) {
                        printf("%s to be added to gid %d, but it doesn't exist!\n", $1, $i) > "/dev/stderr"
                        continue
                }
                group[$i]=group[$i] (g_cnt[$i]++ ? "," : "") $1
        }
}

#all calculated up, print
END {
        for (i=0;i<g_idx_max;i++)
                if (g_cnt[g_idx[i]] > 0) #only print ones we added to
                        print group[g_idx[i]]
}


Last edited by neutronscott; 07-31-2012 at 09:53 PM..
This User Gave Thanks to neutronscott For This Post:
# 5  
Old 08-01-2012
Thanks, scott. I'm still examining this before I run it. I'm confused on where it is accepting input. I think it is the while ((cmd | getline) but I'm not familiar with getline and "getent group" will simply list all groups in the system, not the specific ones I'm determining. Still reading through it but wanted to give my thanks in advance.
# 6  
Old 08-01-2012
ok it is a lot. if you put in separate file and make executable, you run ./script users > upload-file. or you can put all of it in single quotes and use it inside of existing shell script:

Code:
awk '
BEGIN{...}
...code...
}' "$users_file" > "$upload_file"

so it gets the user file as parameter. it first runs getent itself, once, instead of many times and grepping it etc. in the end it will only print groups which it added users to.

awk is quick at text manipulations. probably the rest of the script would incorporate well into it.
# 7  
Old 08-03-2012
So far this works for me - still testing. I'm not familiar w/ using arrays or built-in awk variables but I've been googling and will eventually practise to become more knowledgeable. I've made a few tweaks:

The secondary groups actually start in field 11, so after a bit of tinkering I changed "i" to 11 instead of 4. For some reason the output is always preceded by a "it doesn't exist!" error but the user is also properly included in the respective groups output by the script.

The groups and respective GID's have slight conflicts per server (maybe 5% of the GID's conflict across all servers) so what i typically do is pull them all into 1 big file then sort and uniq them. So, instead of "getent" I replaced that with "cat <group_file>" and it seems to work. I just need to make sure the tool that accepts the group upload file will notify of any conflicts and not wipe out anything which I will do.

I still have a lot to learn about this script but does that sound right - replacing i with 11 instead of 4? Everything appears to check out so far.

Edit: Darn - I also have to sort GID upload files by server so I upload them to the proper one Smilie It just gets better and better!
Login or Register to Ask a Question

Previous Thread | Next Thread

7 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

HELP on 'sectional' or 'group' sorting

Hi, I need to do some section/group sorting. At the moment, I get around it by grep group by group and then re-directing to the same 'final' output file. Below is what's been sorted so far based on the second field $ awk -F"," '{ { print $5 " == " $6 } }' /tmp/x.csv | grep -v "^env" | grep... (2 Replies)
Discussion started by: newbie_01
2 Replies

2. Shell Programming and Scripting

Sorting group of records and loading last record

Hi Everyone, I have below record set. File is fixed widht file 101newjersyus 20150110 101nboston us 20150103 102boston us 20140106 102boston us 20140103 I need to group record based on first 3 letters in our case(101 and 102) and sort last 8 digit in ascending order and print only... (4 Replies)
Discussion started by: patricjemmy6
4 Replies

3. Shell Programming and Scripting

New To UNIX - Need Script to create report of user & group accounts

Hi, I'm new to the world of UNIX and have been asked to create a complex script (at least complex to me:confused:) for AIX UNIX to create a report of all the users on the server including server, user, UID, groups, GID, etc. Found a script using lsuser, but the output is still lacking. 2 things I... (2 Replies)
Discussion started by: panthur
2 Replies

4. Shell Programming and Scripting

need a one liner to grep a group info from /etc/group and use that result to search passwd file

/etc/group tiadm::345:mk789,po312,jo343,ju454,ko453,yx879,iy345,hn453 bin::2:root,daemon sys::3:root,bin,adm adm::4:root,daemon uucp::5:root /etc/passwd mk789:x:234:1::/export/home/dummy:/bin/sh po312:x:234:1::/export/home/dummy:/bin/sh ju454:x:234:1::/export/home/dummy:/bin/sh... (6 Replies)
Discussion started by: chidori
6 Replies

5. Shell Programming and Scripting

Sorting a list of filenames but keeping the path information.

Hi All I've googled around for this and can't see a way of doing it. I have a file that contains a number of records that are layed out something like the following. /path/to/directory/that/contains/a/file/I/need/filename.pdf The path itself can vary both in terms of the names and the... (7 Replies)
Discussion started by: Bashingaway
7 Replies

6. Shell Programming and Scripting

Group on the basis of common text in the square bracket and sorting

File A 99 >ac >ss >juk 70 >acb >defa 90 >ca 100 >aa >abc >bca 85 >cde 81 >ghi >ghij 87 >def >fgh <ijk 89 >fck >ghij >kill >aa The given output shud be 100 >aa >abc >bca 87 >def >fgh <ijk 89 >fck >ghij >kill >aa (2 Replies)
Discussion started by: cdfd123
2 Replies

7. UNIX for Dummies Questions & Answers

Getting information from /etc/group

How can I retrieve the group id of an entry in the /etc/group file given the group name? I tried using cut and grep but cant get around the problem.. I think this problem can be solved using these commands but I dont know how (I am a newbie at this) (11 Replies)
Discussion started by: sleepster
11 Replies
Login or Register to Ask a Question