2015-07-22 35 views
1

我需要從詞「更新」打印「;」。如何從Word中打印到B字(AWK)

file.txt的:

-- Host (first) kkk (queen1) 
-- prince princess#/king 1/1 
update schema.table_name t set "A=123","B=234" where "C=222" and "D=333" 
and "F=2342"; 

-- Host (first) ddd (queen2) 
-- prince princess#/king 2/2 
update schema2.table_name2 t set "A=123","B=234" where "C=222" and "D=333" 
and "F=2342"; 

有了下面的awk,我可以指定解析塊,但我不知道我怎麼可以打印從更新的聲明....直到分號()。

file.awk:

BEGIN { 
} 
/-- Host/,/;/ {       
    if (/-- Host/) printf "%s#%s#",$3,$5; 
    if (/update /) printf ??????????????; 
} 
END { 
}  

這是我如何執行它:

awk -f file.awk -F'[()]+' file.txt 

你可以讓我知道什麼想法嗎?

+0

只是一個提示,你可以省略空'BEGIN'塊。 – hek2mgl

回答

1

我猜你的問題是,在update...線被分成多行。這一行可能會幫助你。但是,您可能需要稍微調整一下以適應您的整個腳本。

awk 'p||/^update/{p=1;printf "%s",$0}/;$/&&p{p=0;print ""}' file 

與您的文件作爲輸入,輸出:這樣做的

update schema.table_name t set "A=123","B=234" where "C=222" and "D=333"and "F=2342"; 
update schema2.table_name2 t set "A=123","B=234" where "C=222" and "D=333"and "F=2342"; 
+0

我需要保留聲明的縮進。我只需要打印原始的SQL語句。謝謝。 – Sigularity

+0

## awk腳本(file.awk):嘗試過但未能打印語句。 /] /,/;/{\t \t \t \t \t \t 如果(/ - 主機/)的printf 「%S#%S#」,$ 3,$ 5; \t \t \t否則如果(/更新:$ /){ \t \t \t \t \t \t splitHipen = $ 2; 分裂(splitHipen,splitHipenArr, 「」); printf「%s#」,substr(splitHipenArr [1],2,length(splitHipenArr [1]) - 2); #TABLE_OWNER \t \t printf的 「%S#」,SUBSTR(splitHipenArr [2],2,長度(splitHipenArr [2]) - 2); #TABLE_NAME \t \t \t {匹配= 1; } \t \t \t如果匹配{打印; } \t \t \t \t \t \t} \t \t \t} – Sigularity

+0

@Sigularity我行給你的想法如何處理的情況下,你需要調整它把你的腳本。如果您想保留換行符,請使用print,而不是printf。做一些測試。 – Kent

0

awk的慣用方式是

awk '/update/,/;/' file.txt 
+0

是的,我知道。我可以像IF(/ update /,/; /)那樣在IF語句中使用這種方式嗎?當我嘗試它時,它失敗了。我需要將所有內容從UPDATE打印到分號。 – Sigularity

+0

只需按原樣嘗試腳本。你不需要if語句。 – karakfa

+0

@karakfa範圍模式將失敗,如果'update'和';'在一行中。 – Kent