bash script for showing last users


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting bash script for showing last users
# 1  
Old 10-26-2009
bash script for showing last users

Hi! I'm new in scripting and I need some help with one simple script. I have to write a program that shows in a predetermined period (using "last" command), to draw up a list of users who have used the machine during this period. Each user to indicate how many sessions it has been during this period. Output must be sorted alphabetically by usernames (increasing alphabetically).

The code should be something like???:
Code:
cat lastfile | cut -c1-8 | egrep -v '(^reboot)|(^$)|(^wtmp a)|(^ftp)' | sort | uniq -c | sort -rn

But how to I predetermine the period and sort alphabetically(increasing)?

Regards,
Vassu

---------- Post updated at 06:48 PM ---------- Previous update was at 01:12 PM ----------

Really nobody can helpSmilie

Last edited by Franklin52; 10-26-2009 at 08:20 AM.. Reason: Please use code tags!
# 2  
Old 10-26-2009
1. sort by name

name occurs in the second field, so specify that field to sort.

Code:
sort -k 2

2. What do you mean by predetermining ? Cant understand that.
# 3  
Old 10-26-2009
I think you're going to have a significant challenge in doing this since you'll have to determine (for each entry) whether the session time range falls within the range you would be specifying. I think I'd convert all of the dates to seconds since epoch which would make your math a bit easier.
# 4  
Old 10-27-2009
Quote:
Originally Posted by thegeek
2. What do you mean by predetermining ? Cant understand that.
It means that user inserts some date [example input: Oct 26 11:00 - Oct 27 14.00] and script output shows all users, who have been logged in during this time, alphabetically. And shows how many sessions they have had in this period. Somehow it can be predetermined to show according to "date" field. Right now without script it shows like this:
Code:
frogger rubiin/wazzar> cat lastfile | cut -c1-8 | egrep -v '(^reboot)|(^$)|(^wtmp a)|(^ftp)' | sort | uniq -c | sort -k 1 | last -10
a72093   pts/6        172.17.1.42      Tue Oct 27 14:00   still logged in
wazzar   pts/4        218.255.196.88.s Tue Oct 27 13:55   still logged in
a72093   pts/15       172.17.1.42      Tue Oct 27 13:50 - 13:59  (00:09)
aller    pts/16                        Tue Oct 27 13:45 - 13:45  (00:00)
aller    pts/15                        Tue Oct 27 13:45 - 13:46  (00:00)
aller    pts/7                         Tue Oct 27 13:45 - 13:50  (00:04)
aller    pts/6                         Tue Oct 27 13:45 - 13:50  (00:04)
a83553   pts/14       fl01.fil.ut.ee   Tue Oct 27 13:38   still logged in
laure    pts/13                        Tue Oct 27 13:34   still logged in
laure    pts/9                         Tue Oct 27 13:31   still logged in

wtmp begins Wed Oct 21 19:10:34 2009
frogger rubiin/wazzar>

Script should show something like this:
Code:
Example:\\>users.sh  Oct 26 11:00 - Oct 27 14.00
 SESSIONS      USER              LAST LOGIN
   12              userA      Tue Oct 27 13:45 - 13:50  (00:04)
    3               userB      Tue Oct 27 13:31   still logged in
    5               userC      Tue Oct 27 13:31   still logged in
   ...              .......        ............................................


Last edited by vassu; 10-27-2009 at 09:50 AM..
# 5  
Old 10-27-2009
Ok, I'm still sticking with this being a more complex problem than a single pipe-line command. If someone else has a better solution, that'd be great.

Some pseudo code:

Code:
Convert your date range input to seconds since epoch for easier calculation (date command can do this depending on version)
  (input start point and input end point ISP and IEP)
Get your pared down output from the 'last' command
for each entry{
  convert that logged in range to seconds since epoch for easier calculation
    (entry start point and entry end point ESP and EEP)
  determine if ((ESP > ISP) and (ESP < IEP)) or ((EEP > ISP) and (EEP < IEP))     # Entry is somewhere within specified range
  If the entry is within the range, save it for later calculations
  Determine when to stop reading 'last' input because the rest don't fall
  into your specified range.
}
Now take the entries that are within your range
  find the unique names and their number of entries and sort by alpha

This would be a useful script if you get it working. Maybe you could post it when done.
# 6  
Old 10-27-2009
It is probably easier to work with the raw wtmp file than with "last" if only because "last" is always in reverse chronological order.
I'm assuming that you want to do this in shell rather than a "C".

The fact that you can process an entire "output from "last" suggests that you properly maintain your wtmp file(s) to a manageable size.

Tip: process the wtmp file with program "fwtmp" and you will have all the raw material in chronological order in a format suitable for splitting into fields with "cut". Each record includes the date since the epoch as well as in character format. Each record contains a code as to the type of record. Beware that some records don't have a username because "wtmp" records that fact that someone is running a login process (hence the reason to use "cut").

There are many possible ways to deal with the timespan. You could run "fwtmp" at the start of the period and again at the end of the period. Count the records in each file and you then know how many have changed. Use "sed" not "tail" to get the records you require. At this point you could convert the selected records back to wtmp format in a file with a new name and run "last" on that file.
# 7  
Old 10-27-2009
That's pretty cool. What OS is that applicable to? Also, what OS is the original post using?
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to block first bash script until second bash script script launches web server/site?

I'm new to utilities like socat and netcat and I'm not clear if they will do what I need. I have a "compileDeployStartWebServer.sh" script and a "StartBrowser.sh" script that are started by emacs/elisp at the same time in two different processes. I'm using Cygwin bash on Windows 10. My... (3 Replies)
Discussion started by: siegfried
3 Replies

2. Ubuntu

Expect /bash, 2 ssh login users

HI all i need to connect to about 900 cisco routers and switch to do some configs changes. the issue i am having is that half the devices have one set of username and password and the other half have another username and password. From expect or bash script i can ssh into a device and make... (1 Reply)
Discussion started by: quintin
1 Replies

3. UNIX for Dummies Questions & Answers

About adding users from a text file using bash

hello, I try to add users from a text file with this form: username:groupename:homedir first i extract data which is separated by ":" then i use useradd to add users/groups. but,,, my code doesn't works : #!/bin/bash echo "give me a text file: " read dir # control if... (2 Replies)
Discussion started by: ref012
2 Replies

4. Shell Programming and Scripting

Script in bash wchich creating a new users...

Hi, I am a new on this forum but i like :) I need a script in bash which will be crating a new user with folder for websites. For example: I will run this program and he creating a new user(with my name) and folder whcich name like user and if i will localho/~user in browser, she show me files from... (1 Reply)
Discussion started by: puclavv
1 Replies

5. Red Hat

Showing all users in 'users' and 'top' commands

Hi All, I work in a multi user environment where my school uses Red Hat Linux server. When I issue commands such as "top" or "users", I get to see what others are doing and what kinds of applications they are running (even ps -aux will give such information). "users" will let me know who else is... (1 Reply)
Discussion started by: shoaibjameel123
1 Replies

6. UNIX for Dummies Questions & Answers

Need help showing which network protocol users use.

I'm having a bit of a trouble trying to figure out how to tell which network protocol users HAVE been logging in with. I know how to find this information for currently logged in users : maximillian.gardner@syccuxfs01:~> who joseph.blosser pts/0 2012-01-15 14:07 (198.107.160.185)... (5 Replies)
Discussion started by: maximillian.g
5 Replies

7. Shell Programming and Scripting

Bash Help: users who are not logged into the system to display

A Newbie here, I am working on a script and am having problems with the else part of the script. I can't get the users who are not logged into the system to display on the screen with their username and the text "The user is not logged in". I am sure it is something simple and stupid, but I... (5 Replies)
Discussion started by: rchirico
5 Replies

8. Shell Programming and Scripting

Showing offline users

Hi, Is there any command for showing offline users? The only way I can think of doing it (as i cant find a command) is getting a list of all the online users, and comparing it to /etc/passwd, anything that is in /etc/passwd and not in the users file will be offline users. But I have no... (4 Replies)
Discussion started by: mikejreading
4 Replies

9. Shell Programming and Scripting

bash/awk scripting help (creating OLD new users)

I need some help making this script... I guess I'm having trouble even interpretating what to even get started on... I need to create a script that will search a given directory (typically a user's home directory, but not necessarily) as provided on the command line and any sub-directors for... (2 Replies)
Discussion started by: Jukai
2 Replies
Login or Register to Ask a Question