Hi Friends,
Scripting newb here. So I'm trying to create a geektool script that uses awk and printf to output certain fields from top (namely command, cpu%, rsize, pid and time, in that order). After much trial and error, I've pretty much succeeded, with one exception. Any process whose name is more than one word, such as system events or system pre..., gets the first word outputted to command ($2), the second outputted to cpu% ($3), cpu% outputted to time ($4) and so on. I'm pretty sure there's a way to fix this so that both words are outputted to the command column using if, but be as I possess very rudimentary scripting skills, I have no idea how to do this. Here's what I have so far:
top -FR -l2 -ocpu | grep -v ' 0.0% ..:' | awk '{printf( "%-12s %-5s %-5s %-5s %s\n", $2,$3,$10,$1,$4 ) }' | sed -n '15,$p'
Below is what I'm seeing.
Any help would be greatly appreciated.
Thanks,
Thom
I don't quite follow the dilemma here and I don't have that version of 'top'.
Could you quote the input as it comes to 'awk' (using code tags, please) - no need to attach images.
You can copy/paste the code, select it and click on '#' in the upper bar of the forum message editor.
Also, if you're using 'awk' it's most likely you don't need 'grep'.
Sorry if I was unclear. If I understand you correctly (please forgive me if I haven't), the input is something like this:
Processes: 98 total, 17 running, 3 stuck, 78 sleeping... 442 threads 15:58:34
Load Avg: 12.05, 11.64, 12.16 CPU usage: 73.11% user, 26.89% sys, 0.00% idle
PhysMem: 271M wired, 1048M active, 577M inactive, 1897M used, 151M free.
VM: 61G + 0 146058(0) pageins, 41853(0) pageouts
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
66110 GeekTool 11.7% 3:16:32 73 923- 0 0- 0- 55M 1006M
31858 firefox-bi 5.8% 52:15.57 18 227 0 0- 0- 320M 1273M
87943 perl 3.7% 0:00.25 1 13 0 0- 0- 5368K 589M
87902 perl 3.5% 0:00.31 1 14+ 0 0- 0- 7104K 590M
87942 perl 3.0% 0:00.24 1 13 0 0- 0- 5368K 589M
87941 perl 2.9% 0:00.23 1 13 0 0- 0- 5368K 589M
63 coreservic 2.6% 15:55.41 2 243+ 0 0- 0- 18M 645M
66070 WindowServ 2.0% 27:07.05 6 387+ 0 0- 0- 84M 1015M
0 kernel_tas 1.6% 24:31.65 62 2 0 0- 0 157M 1122M
15 distnoted 1.2% 8:31.58 1 66+ 0 0- 0- 852K 586M
66106 Last.fm 0.8% 7:25.17 10 167 0 0- 0- 27M 993M
87946 top 0.7% 0:00.14 1 32+ 0 0- 0- 1016K 586M
87551 Terminal 0.7% 0:00.42 5 107 0 0- 0- 9532K 927M
87930 top 0.5% 0:00.19 1 17+ 0 0- 0- 1020K 587M
11 DirectoryS 0.5% 3:38.61 5 84 0 0- 0- 3380K 589M
66163 System Eve 0.4% 2:18.47 2 86+ 0 0- 0- 6452K 901M
My dilemma is that I can't figure out how to conditionally keep an input (in this case the words System Eve from column 2 of the top process) from being broken up into separate fields when it is outputted via awk and printf.
EDIT:: Just read around some more and it seems like this is is a field separator issue. Given the breaks, any idea what separator I should use?
Something along these lines...
top -FR -l2 -ocpu | awk -f thom.awk
thom.awk:
BEGIN {
tab=sprintf("\t")
OFS=","
}
function trim(str)
{
sub("^([ ]*|" tab "*)", "", str);
sub("([ ]*|" tab "*)" "$", "", str);
return str;
}
$1 ~ /^[0-9]/ {
pid=$1
rest=substr($0,index($0,$2))
match(rest,"[0-9.]*%")
name=substr(rest,1, RSTART-1)
$0=substr(rest,RSTART)
print trim(name), $1, $8, pid, $2
}