Help with ksh script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Help with ksh script
# 1  
Old 11-17-2010
Bug Help with ksh script

Hi there - was wondering if anyone has a good shell script that counts the number of unique users within a logfile that is timestamped. I want to count the number of unique users every 15 mins - the log files looks like this and has 24hrs of data;

00:10:00 S478959
00:10:01 S895423
00:10:02 S990884

Thanks
# 2  
Old 11-17-2010
Assuming the timestamp in column 1 and user name in column 2, this is a small awk programme that will print unique user names by quarter hour. The output is one line per quarter hour with the timestamp in the form: hh:mm+n where n is the quarter, 0-3.

Code:
#!/usr/bin/env ksh

 awk '
        {
                split( $1, a, ":" )
                qtr = int( a[3]/15 );
                if( !seen[a[1],a[2],qtr,$2]++ )    # add user to the quarters list if not yet observed in the quarter
                        users[a[1]":"a[2]"+"qtr] =  users[a[1]":"a[2]"+"qtr] $2 " ";
        }
        END {
                for( x in users )
                        printf( "%s %s\n", x, users[x] );
        }
' <input-file | sort >output-file

# 3  
Old 11-17-2010
Do you need zero count lines when no users are in the logfile? This solution only prints count if a user was in the file for the 15 min period, also periods are hard-coded for 15,30,45 mins past the hour.

Code:
awk -F"[: ]" 'NR==1 { T=int(($2+15)/15);;H=$1 }
{if (Q=int(($2+15)/15) != T || $1 != H) {
    printf "%02d:%02d:00 %d\n", H, T*15, length(users);
    delete users;
    H=$1;
    T=Q;
  }
  users[$4]++;
 }
END { printf "%02d:%02d:00 %s\n", H,Q*15, length(users); }' users.log

Code:
$ cat users.log
00:10:00 S478959
00:10:01 S895423
00:10:02 S990884
00:12:02 S990001
00:15:02 S990002
00:17:02 S990003
00:21:02 S990004
00:22:02 S990005
00:27:02 S990001
03:03:17 S993093
 
$ ./users.awk
00:00:00 4
00:15:00 5
03:15:00 1


Last edited by Chubler_XL; 11-17-2010 at 08:39 PM.. Reason: Fixup if no log entries for >1hr
# 4  
Old 11-18-2010
Code:
awk -F"[: ]" '
function f(str) {return sprintf("%02d",str)}
!b[$1 ":" f(T) FS $4] {T=int(($2+15)/15)*15-15;u[$1 ":" f(T)]++;b[$1 ":" f(T) FS $4]++}
END { for (i in u) { print i, u[i]|"sort -n" }}' users.log

00:00 4
00:15 5
03:00 1

If you need time range:

Code:
awk -F"[: ]" '
function f(str) {return sprintf("%02d",str)}
!b[$1 ":" f(T) FS $4] {T=int(($2+15)/15)*15-15;u[$1 ":" f(T)]++;b[$1 ":" f(T) FS $4]++}
END { for (i in u) {split(i,a,":"); print i, "-", a[1] ":" a[2]+15, u[i]|"sort -n" }}' users.log


00:00 - 00:15 4
00:15 - 00:30 5
03:00 - 03:15 1


Last edited by rdcwayx; 11-18-2010 at 12:57 AM..
# 5  
Old 11-18-2010
Hi guys - Thanks for your responses the last piece of code is really what I think I need. I'm basically looking for concurrent users within a 15 mins period in a 24hr file so I think the last bit of code would do it. Can I also ask if my file name is called users.out where would I read this in - Would I cat the file then run the awk code you've kindly given me? Thanks in advance Smilie
# 6  
Old 11-18-2010
Just replace the users.log with the path to your users.out file eg/

Code:
awk -F"[: ]" '
function f(str) {return sprintf("%02d",str)}
!b[$1 ":" f(T) FS $4] {T=int(($2+15)/15)*15-15;u[$1 ":" f(T)]++;b[$1 ":" f(T) FS $4]++}
END { for (i in u) {split(i,a,":"); print i, "-", a[1] ":" a[2]+15, u[i]|"sort -n" }}'  /home/offerance/logs/user.out

---------- Post updated at 08:01 PM ---------- Previous update was at 05:55 PM ----------

Here is another solution using mktime and strftime. I like it cause it dosn't need to call sort and only uses 1 array (to count uniq users):

Code:
awk -F"[: ]" '
function pRes(s,u) {
  printf "%s - %s %d\n",
    strftime("%H:%M", s), 
    strftime("%H:%M", s+900), length(u); 
}
NR==1 {S=mktime("2000 1 1 "$1" "int($2/15)*15" 0"); }
{
    C=mktime("2000 1 1 "$1" "$2" "$3);
    if (C > S+900) {
        pRes(S,users);
        S=int(C/900)*900;
        delete users;
     }
     users[$4]++;
}
END { pRes(S,users); }' /home/offerance/logs/user.out

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Script to replace lines in ksh Script

Hi All, I am novice to Unix and I need your expert advice for the below task. There is a KSH script file in which I need to replace few line as per the below expectations. So my file look like as # Host Setup Command: Line 1 Line 2 Line 3 Line 4 Line Any... (6 Replies)
Discussion started by: rupid0609
6 Replies

2. Shell Programming and Scripting

Deploy ksh script to file from other script

Hi all, I need to deploy two scripts on around ~100 machines and have only OPSware. Opsware have the option to execute a script, so I am trying to write a script which dose cat > script.ksh <<EOF script to be deployed EOF However the script between the two EOFs gets also executed which... (0 Replies)
Discussion started by: click
0 Replies

3. Shell Programming and Scripting

Help Create dynamic ksh script from a script

I am currently running 2 scripts to gather data for a 3rd script and would like to combine the 2 scripts into one. Having issues with the final output format. Note cannot post URL so replaced the http stuff with (name) in the examples All scripts contain #!/bin/ksh OS = Red Hat Enterprise... (0 Replies)
Discussion started by: pcpinkerton
0 Replies

4. Shell Programming and Scripting

KSH script to run other ksh scripts and output it to a file and/or email

Hi I am new to this Scripting process and would like to know How can i write a ksh script that will call other ksh scripts and write the output to a file and/or email. For example ------- Script ABC ------- a.ksh b.ksh c.ksh I need to call all three scripts execute them and... (2 Replies)
Discussion started by: pacifican
2 Replies

5. Shell Programming and Scripting

passing a variables value from the called script to calling script using ksh

How do i get the value of the variable from the called script(script2) to the calling script(script1) in ksh ? I've given portion of the script here to explain the problem. Portion of Script 1 ============= ----- ----- tmp=`a.ksh p1 p2 p3` if then # error processing fi -----... (10 Replies)
Discussion started by: rajarkumar
10 Replies

6. Shell Programming and Scripting

import var and function from ksh script to another ksh script

Ih all, i have multiples ksh scripts for crontab's unix jobs they all have same variables declarations and some similar functions i would have a only single script file to declare my variables, like: var1= "aaa" var2= "bbb" var3= "ccc" ... function ab { ...} function bc { ... }... (2 Replies)
Discussion started by: wolfhurt
2 Replies

7. Shell Programming and Scripting

tracing a ksh script within a ksh script

I normally trace a script with the ksh -x <script name> and redirect strderr to file. But if you have a script like the examble below...... vi hairy bear=`grep bear animals` if then ksh more_animals fi If I ksh -x hairy it won't trace "more_animals" unless I put a -x in it. Is... (1 Reply)
Discussion started by: shorty
1 Replies

8. Shell Programming and Scripting

how to convert unix .ksh script to windows .batch script

I am using awk in my .ksh script but when I am trying to run in windows its not recognising awk part of the ksh script , even when I changed it to gawk it does not work, this is how my .ksh and .bat files look like. thanx. #!/bin/ksh egrep -v "Rpt 038|PM$|Parameters:|Begin |Date: |End... (1 Reply)
Discussion started by: 2.5lt V8
1 Replies

9. Shell Programming and Scripting

executing a ksh script from another ksh script

Hi, I'm new to unix scripting.How can i call a script from another script. I have a.ksh and b.ksh .I have to call b.ksh from a.ksh after it is successfully exceuted. I tried using #!/bin/ksh -x in a.ksh and at the end i have used /path/b.ksh My problem is it is executing only a.ksh.it... (6 Replies)
Discussion started by: ammu
6 Replies

10. UNIX for Dummies Questions & Answers

SQL Script run in KSH Script

I've got a SQL script that is executed through a UNIX ksh script. It is working fine, but I wanted to add a line to put a date/time stamp in the log file that it generates. This is more of a SQL question, but I'm hoping someone can help me get the date/time...I've changed the script with the... (2 Replies)
Discussion started by: dstinsman
2 Replies
Login or Register to Ask a Question