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.
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
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.
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.