Path: utzoo!attcan!uunet!mcvax!philmds!leo From: leo@philmds.UUCP (Leo de Wit) Newsgroups: comp.unix.questions Subject: Re: Unix shell prgrams and AI techniques Message-ID: <514@philmds.UUCP> Date: 20 Jun 88 18:33:40 GMT References: <7387@watdragon.waterloo.edu> Reply-To: leo@philmds.UUCP (L.J.M. de Wit) Distribution: comp Organization: Philips I&E DTS Eindhoven Lines: 113 In article <7387@watdragon.waterloo.edu> tcjones@watdragon.waterloo.edu (Terry) writes: > > >Here is a shell program I use to see who else is programming at the same time >as me. >---------------cut here------------- >last > file.last >sort < file.last > file.sorted >cut -c1-18 < file.sorted > file.cut >tr -d ' ' < file.cut > file.names >cut -c19- < file.sorted > file.other.data >paste file.other.data file.names > file.paste >uniq +60 file.paste > file.output > >grep 'still logged in' file.last > temp.1 >cut -f1 -d' ' < temp.1 > file.logged.in >sort < file.logged.in > file.sorted.logged.in >uniq < file.sorted.logged.in > file2.output > >fgrep -f file2.output file.output > answerfile.out > >more answerfile.out >---------------cut here--------------- > >This program has a lot of problems, uses a lot of CPU and memory. It >also prints multiple names, even though I use uniq a few times. I would >be really interested to get some AI techniques to improve it. Here is a somewhat faster version (at least, it satisfies the specs): ---------------cut here--------------- who ---------------cut here--------------- or even shorter, if you have a Berkeley system: ---------------cut here--------------- w ---------------cut here--------------- who is in /bin, so it should be fairly standard. Gives you login, tty and login time. w gives some additional information (load of system, process that's running). As for your style, I think it can be somewhat improved. It's hard to figure out what the program itself does, at least what it is meant to do 8-). Quoting the first part: >last > file.last >sort < file.last > file.sorted >cut -c1-18 < file.sorted > file.cut >tr -d ' ' < file.cut > file.names >cut -c19- < file.sorted > file.other.data >paste file.other.data file.names > file.paste >uniq +60 file.paste > file.output file.output seems like a unique username/tty-sorted output of last, with the username / tty field put behind (the reason why to put them behind is obscure). If we take the first line (last > file.last) for granted, the other six could be written as: sort -u +0 -20 file.last | sed 's/^\(....................\)\(.*\)$/\2\1/ s/ *$//' > file.output >grep 'still logged in' file.last > temp.1 >cut -f1 -d' ' < temp.1 > file.logged.in >sort < file.logged.in > file.sorted.logged.in >uniq < file.sorted.logged.in > file2.output file2.output seems like a file containing names of users still logged in (unique and sorted). I would prefer to write it: sed -n -e '/still logged in/s/ .*$//p' file.last | sort -u >fgrep -f file2.output file.output > answerfile.out > >more answerfile.out This is something like: show me the data from the first file for the users still logged in. In that case, why not in the first place something like last -300 | sed -n -e ' 300q /still logged in/{ s/^\(....................\)\(.*\)$/\2\1/ s/ *$// p }' | sort -u +60 | more Advantages: no temp files (you still have to remove all those temp files) and last quits after some 300 lines (could increase it). Besides that the use of pipelines makes better use of disk space (I think). Does this sedisfy you, Terry 8-)? As you can see, I'm a sed weirdo. One of the better tools of Unix I think: Power, Simplicity and Velocity (P.S.V.) Leo. B.T.W. Testing this script I discovered what seems to be a bug in sort (Ultrix 2.0). The following two lines when fed into sort -u +15: Mon Jun 20 19:36 still logged inuucp ttyic Mon Jun 20 18:07 still logged inleo ttyid generate only one line: Mon Jun 20 19:36 still logged inuucp ttyic The manual says: A missing -num argument means the end of the line, and for u: Suppress all but one in each set of equal lines. Ignored bytes and bytes outside keys do not participate in the comparision. Am I wrong or is the manual wrong (or is sort buggy)? Leo.