IF and awk/printf


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting IF and awk/printf
# 1  
Old 06-09-2009
IF and awk/printf

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:


Code:
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
IF and awk/printf-picture-1png

Last edited by thom.mattson; 06-09-2009 at 09:23 PM..
# 2  
Old 06-09-2009
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'.
# 3  
Old 06-09-2009
Sorry if I was unclear. If I understand you correctly (please forgive me if I haven't), the input is something like this:

Code:
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?

Last edited by thom.mattson; 06-09-2009 at 09:22 PM..
# 4  
Old 06-10-2009
Something along these lines...

top -FR -l2 -ocpu | awk -f thom.awk

thom.awk:
Code:
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
}


Last edited by vgersh99; 06-10-2009 at 08:19 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk printf dillemma

Please help me format this file: Source file looks like this, there are three columns, separated by space. First column has varrying width: 1 248105240 W25_2013 10 248103710 W06_2013 100 248103710 W06_2013 1000 248103710 W06_2013 I need to transform the file into a fixed width per column.... (1 Reply)
Discussion started by: tamahomekarasu
1 Replies

2. Shell Programming and Scripting

Use of awk and printf - help needed

I have a very large file with more than 500,000 lines of dated events. The first field contains the date/time in the following format: 20120727-files.files:20120727090044 where the first 8 numbers represent yyyymmdd. The last set of numbers represent yyyy/mm/dd/hh:mm:ss I would like to... (4 Replies)
Discussion started by: LDHB2012
4 Replies

3. Shell Programming and Scripting

printf format with awk

Hello Here is an easy one Data file 12345 (tab) Some text (tab) 53.432 23456 (tab) Some longer text (tab) 933.422 34567 (tab) Some different text (tab) 29.309 I need to awk these three tab-delimited columns so that the first two are unchanged (unformatted) and the third shows two decimal... (1 Reply)
Discussion started by: palex
1 Replies

4. Shell Programming and Scripting

awk with printf

Hi, I am using the following code to assign a count value to a variable. But I get nothing. Do you see anything wrong here. I am new to all this. $CTR=`remsh $m -l $MACHINES{$m} -n cat $output | grep -v sent | grep \"$input\" | sort -u | awk '{print $5}'`; Upto sort - u it's... (2 Replies)
Discussion started by: nurani
2 Replies

5. Shell Programming and Scripting

AWK printf help

Target file contains short text (never more than 1 line) and filenames. The format is, e.g.,: TEXT1 filename1 TEXT2 TEXT3 filename3dddd filename3dddd TEXT4 filename4 TEXT5 filename5dddd filename5dddd filename5 where dddd is a random 4-digit whole number. Desired output: (4 Replies)
Discussion started by: uiop44
4 Replies

6. Shell Programming and Scripting

awk and printf

echo $bbsize 1.5 echo $fillpercent .95 echo $bbsize | awk '{printf "%.2f\n",$0*$fillpercent}' 2.25 echo $bbsize | awk '{printf "%.2f\n",$0*.95}' 1.42 1.42 is what I'm expecting... echo $blocksize 4096 echo $bbsize | awk '{printf "%.2f\n",$0*$blocksize}' 2.25 echo $bbsize |... (3 Replies)
Discussion started by: xgringo
3 Replies

7. Shell Programming and Scripting

printf in awk

Hi friends.. I am confused about awk printf option.. I have a comma separated file 88562848,21-JAN-08,2741079, -1188,-7433,TESTING 88558314,21-JAN-08,2741189, -1273,-7976,TESTING and there is a line in my script ( written by someone else) What is the use of command? I guess... (10 Replies)
Discussion started by: clx
10 Replies

8. Shell Programming and Scripting

Awk printf problem

Hi, I've got a basic problem using printf statement in awk. I want to write float values with always 8 characters width. Examples : 1.345678 12.45678 123.4567 1234.678 -23.5678 -2.45678 -23456.8 ..... I cannot find the right printf format %8.1f, %7.5f.... Can anyone help ?... (4 Replies)
Discussion started by: cazhot
4 Replies

9. UNIX for Dummies Questions & Answers

AwK printf question

Hi, Does anyone know a easy way to printf $3,$4, ... all the way to the last field in the file? I will need to modify $1 and $2 and then printf modified $1 and $2 and the rest of the fields(which are not changed). I know I can use NF as the total number of field. Do I use a for next statement to... (4 Replies)
Discussion started by: whatisthis
4 Replies

10. UNIX for Advanced & Expert Users

awk printf problem

Hi Friends, Can anyone guide me how to compute sum of column4 from the below file x using awk command? when i do using awk I'm getting sum 7482350198352648.000000 which is not accurate. $ cat x 56,232,dfgjkhdfj,,56,anand 56,22,dfgjkhdfj,7482347823453123.97834 ,56,Khan 56,23,dfgjkhdfj, ... (6 Replies)
Discussion started by: krishna
6 Replies
Login or Register to Ask a Question