The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Passing the values to the secondary script when it invoked by primary script venu_eie UNIX for Advanced & Expert Users 2 07-03-2008 07:10 AM
Passing the values to the secondary script when it invoked by primary script venu_eie Shell Programming and Scripting 1 07-03-2008 06:16 AM
create a shell script that calls another script and and an awk script magikminox Shell Programming and Scripting 0 06-26-2008 02:50 AM
help me in sending parameters from sqlplus script to unix shell script Hara Shell Programming and Scripting 2 01-29-2008 03:31 PM
Shell Script: want to insert values in database when update script runs ring Shell Programming and Scripting 1 10-25-2007 03:06 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 02-11-2009
fedora fedora is offline
Registered User
  
 

Join Date: Jul 2006
Posts: 93
how to fix this awk script?

i have a log file while looks like this

++
user_a blabla
blabla nas_b blabla user_d
this is a user_a
junk line
another junk line
user_c nas_m blabla
++

basically most of the lines contain a "user" keywords, and the rest of the lines do not have "user" at all.

So I have the following script, which just extracts the user part(if that line has a user keyword) from each line

awk '{ for (i=0; i<=NF; i++)
if($i~/user/)
{a=$i}
else
{continue}
{print a}
}' /tmp/test

and when I run it, I got the following result

user_a
user_d
user_a
user_a #<===actually there is no user in that line at all.
user_c

why this happens and how can I fix my script? thanks
  #2 (permalink)  
Old 02-11-2009
joeyg's Avatar
joeyg joeyg is offline Forum Staff  
modérateur
  
 

Join Date: Dec 2007
Location: Home of 17-time world champion Boston Celtics
Posts: 1,311
Cool

I think it is because you are always printing a value. So, you are not over-writing 'a' ni the instance of the 4th line, so when you print the variable, you are getting the last stored value of 'a'.
Perhaps as the first line ater your else, do a
Code:
a=""
to blank out the last 'a' value?
  #3 (permalink)  
Old 02-11-2009
fedora fedora is offline
Registered User
  
 

Join Date: Jul 2006
Posts: 93
I reliazed that problem, but it seems I can not fix the problem, here is the modified script

awk '{ for (i=0; i<=NF; i++)
if($i~/user/)
{a=$i}
else
{a="no"}
{ continue}
{print a}
}' /tmp/test

and the output change to

no
user_d
user_a
no
no

which is not correct at all.


Quote:
Originally Posted by joeyg View Post
I think it is because you are always printing a value. So, you are not over-writing 'a' ni the instance of the 4th line, so when you print the variable, you are getting the last stored value of 'a'.
Perhaps as the first line ater your else, do a
Code:
a=""
to blank out the last 'a' value?
  #4 (permalink)  
Old 02-11-2009
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
addict
  
 

Join Date: Jan 2007
Location: Варна, България / Milano, Italia
Posts: 2,794
With awk:

Code:
awk '{ 
  for (i=1; i<=NF; i++)
    if ($i ~ /user/)
      print $i
      }' infile
With Perl:

Code:
perl -lne'print $1 while /(user[^\s]*)/g' infile
With GNU grep:

Code:
grep -o 'user[^ \t]*' infile
  #5 (permalink)  
Old 02-11-2009
fedora fedora is offline
Registered User
  
 

Join Date: Jul 2006
Posts: 93
Thanks, I know in this example I gave, egrep is a better choice, but actually my real work is "finding out both "user" and "nas" part, and then print out the result.

below is the result I want

+
user_a nas_b
user_d nas_b
user_a
user_c nas_m
+

But the problem is, no matter how i modified my script, I just won't get the desired result...

[quote=radoulov;302286540]With awk:

Code:
awk '{ 
  for (i=1; i<=NF; i++)
    if ($i ~ /user/)
      print $i
      }' infile
With Perl:
  #6 (permalink)  
Old 02-11-2009
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
addict
  
 

Join Date: Jan 2007
Location: Варна, България / Milano, Italia
Posts: 2,794
Quote:
Originally Posted by fedora View Post
Thanks, I know in this example I gave, egrep is a better choice, but actually my real work is "finding out both "user" and "nas" part, and then print out the result.

below is the result I want

+
user_a nas_b
user_d nas_b
user_a
user_c nas_m
+
I don't understand the logic ...
Why user_d nas_b?
  #7 (permalink)  
Old 02-11-2009
fedora fedora is offline
Registered User
  
 

Join Date: Jul 2006
Posts: 93
sorry, that was a typo
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -4. The time now is 07:59 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language translation by Google.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0