shade88
shade88

Reputation: 102

AWK file multiline command not working

I have an awk file get_PV_sql_from_file.awk:

#! /bin/awk -f
/^CREATE.*VIEW.*PV_/
{ 
inside_create = 1; print "view found" 
}   

{                               
if(inside_create == 1)      
    {       
    print $0                    
    }                           
}

/.*;$/ 
{               
    if(inside_create == 1){             
        inside_create = 0;  
    }                           
}

And when i run it:

awk -f get_PV_sql_from_file.awk test_PV_sql.txt

I have got "view found" phrase in each line:

view found
CREATE  FORCE VIEW "POSC"."P3V_SEC_TREES_V" ("BSASC_ID", "BSASC_S", "LV0_K", "LV0_V", "LV1_K", "LV1_V", "LV2_K", "LV2_V", "LV3_K", "LV3_V", "LV4_K", "LV4_V", "LV5_K", "LV5_V") AS 
view found
  SELECT DISTINCT
view found
 B1.BSASC_ID,
view found
 B2.BSASC_S,
view found
 R_SEC_TREES.LV0_K,
view found
 R_SEC_TREES.LV0_V,
...
etc

But if i write each command in awk file on a single line:

#! /bin/awk -f
/^CREATE.*VIEW.*PV_/ { inside_create = 1; print "view found" }  

{ if(inside_create == 1) { print $0 } }

/.*;$/ { if(inside_create == 1) { inside_create = 0; } }

It is works right:

view found
CREATE  FORCE VIEW "POSC"."PV_SEC_MODULES_V" ("BSASC_ID", "MODULE", "ACT") AS 
  SELECT DISTINCT
 B1.BSASC_ID BSASC_ID,
 BSASC_PRIVILEGE.GDLN_OR_PRIV_ID MODULE,
 BSASC_PRIVILEGE.R_BSASC_PRIV_KIND ACT
...
etc

Why is this happening? And where i made mistake?

Upvotes: 0

Views: 128

Answers (1)

Ross Ridge
Ross Ridge

Reputation: 39581

You need to put the pattern and the opening brace that begins the action on the same line. Otherwise the pattern is treated as not having any action, so the default action, print the line, is performed. The action on the next line is then treated as having no pattern which means it matches every line. So write your AWK code like this:

/^CREATE.*VIEW.*PV_/ { 
    inside_create = 1; print "view found" 
}   

{                               
    if(inside_create == 1)      
    {       
        print $0                    
    }                           
}

/.*;$/ {               
    if(inside_create == 1) {             
        inside_create = 0;  
    }                           
}

Upvotes: 1

Related Questions