printing each users by processes

hello All,

i am trying to get the each users by with thier processing. I have try it in several ways but i am not getting thier my code is

#!bin/bash/
users=`cat /etc/passwd | cut -d':' -f5`
onlineusers=`users | tr '.' ' '`
$onlineusers | while read `$users`
do
echo `ps -U $users`
done

but its not working, root: it says command not found

pls any way around it.

The correct syntax is

while read users

What you have tries to evaluate the value of $users as a command, thus you get "root: command not found" (because the first user is root, so that is the command, and the rest of the users are passed as arguments to this command).

Why do you extract users from /etc/passwd when you end up reading them from users? On my system, users prints the same user multiple times if they are logged in multiple times, which might not be what you want.

Here's the whole script with the problems fixed:

#!/bin/bash
users | tr '. ' '
' | sort -u | while read user
do
  ps -U "$user"
done

The second argument to tr is a newline inside single quotes; opening quote, end of line, new line, closing quote. Yes, that's a valid string in bash (and sh generally). This breaks up the output of users on multiple lines so we can sort -u to get rid of any duplicates.

The output of users on my Ubuntu box doesn't have any full stops in it, but maybe yours is different.

I also took out the (as far as I could tell) gratuitous echo `backticks` and the temporary assignment of the output of users to a variable which only got used once. Oh, and I fixed the shebang line -- there should be no slash after bash, and one before bin.

Thanks era

Have u tried the code, its not working on my mine.

I am trying to get individual online REAL NAME and not the USERNAME with thier correspondence processes. Using the etc/passwd would get the name
but comparing it with users online is the complicated bit.

Yes, I have tested it here (but only after you asked). I only have one user so it's not a very thorough test case.

Do you get an error, or doesn't it do what you expect?

Where do you want the real name to be displayed?

#!/bin/bash
users | tr '. ' '
' | sort -u | while read user
do
  sed -n "s/:[^:]*:[^:]*$//;s/^$user:[^:]*:[^:]*:[^:]*://p" /etc/passwd
  ps -U "$user"
done

The sed script is the moral equivalent of grep "^$user:" /etc/passwd | cut -d: -f5 which is arguably more readable. Maybe you want to use that instead, actually.

Thanks for the reply era
But i still get error username not found and some of this against each user

********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy

What does the output from users look like on your system? Which platform is this?

firstname.surname firstname.surname firstname.surname

Ah, right, for me it prints the username, which is more straightforward to process.

Would this work any better?

#!/bin/bash
users | tr ' ' '
' | sort -u | while read user
do
  echo $user
  ps -U `grep ":$user[,:]" /etc/passwd | cut -f1`
done

I simply pass through the dot in the full name since it matches any character (including, conveniently, space) in a regular expression.

pls can u explain this part of the code

`grep ":$user[,:]" /etc/passwd | cut -f1

what i really want is their name and each individual processes such as

joe bloggs
PID TTY TIME CMD

peter jackson
PID TTY TIME CMD

baba mama
PID TTY TIME CMD

wasn't something similar answered here?

yeah
but i dont know about awk yet and i dont want to use things i am not fully aware of, am just reading about it.
I would love to find other means in getting the desired output.

Thanks

We grep for ":" because that's the separator in the passwd file, followed by the user name, followed by either another colon, or a comma, because many passwd files have gcos fields after the user's name. My entry looks like this:

era:x:1000:1000:era,,,:/home/era:/bin/bash

The commas would properly separate room number, phone number etc information.

Oops, the cut -f1 should be cut -d: -f1 of course.