2013-05-06 68 views
1

所有的權利,KSH:使用SED返回文本模式

我想寫使用SED一個KSH腳本(我很新的ksh)從日誌翻出這個SQL查詢,但我希望它忽略時間戳和後面的六個字符/空格。這裏是我到目前爲止的代碼...

cat file.log \ 
| sed -n '/---Query1/,/selected/p' \ 
| sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g' \ # My problem 
> newfile.log 

===Input=== 

11:23:34 SQL> ---Query1  
11:23:34 SQL> select a.column1, b.column2, count(*) 
11:23:34 2 from table1 a, table2 b 
11:23:34 3 group by a.column1 
11:23:34 4 order by 1, 2, 3; 

a.column1 a.column2 count(*) 
----------- ----------- ---------- 
foo   bar   32 

1 row selected. 


===Desired Output=== 

---Query1 
select a.column1, b.column2, count(*) 
from table1 a, table2 b 
group by a.column1 
order by 1, 2, 3; 

a.column1 a.column2 count(*) 
----------- ----------- ---------- 
foo   bar   32 

1 row selected. 

任何幫助你可以提供非常感謝。

+0

+1樣品輸入/輸出AND代碼。繼續發帖,祝你好運。 – shellter 2013-05-06 18:30:27

回答

1

這可能會爲你工作(GNU SED):

sed -r 's/^..:..:...{6}//' file 
+0

這也工作!謝謝! – caw04005 2013-05-07 13:47:30

1

只是做你的榜樣數據一個小的測試,它在這裏工作: 「?」

sed -r '/^[0-9][0-9]:[0-9][0-9]/{s/^.*SQL> *//;s/^[0-9:]* +[0-9]+ +(.)/\1/}' file 
2

在正則表達式的意思是「零或1次出現前述RE片段的」,這樣,當你寫:

[0-9]? 

你說「零或1次出現的一個數字的」。我懷疑你正在得到「?」的含義在RE中混淆了它在shell中的意思,即「任何單個字符」。 RE元字符表示「任何單個字符」是「。」,而不是「?」。

所以我認爲,當你寫道:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g' 

你居然打算寫:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]......)//g' 

您可以縮寫爲:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g' 

隨着一些(如GNU) sed的可以寫成「。{6}」,而不是6個明確的「。」。

請注意,您不需要「貓」,並且如果您將管道放在每行的末尾而不是下一行的末尾,那麼您也不需要轉義反斜槓。你也不需要括號圍繞你的RE,因爲你永遠不回參考或以其它方式使用它例如:

sed -n '/---Query1/,/selected/p' file.log | 
sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]......//g' > newfile.log 
+0

它的工作完美,感謝你的課。大約兩週前我打開了我的第一本KSH書,所以我試圖吸收我現在可以做的任何事情。 – caw04005 2013-05-07 13:47:08

+2

瞭解關於殼牌最重要的事情是,雖然它具有編程語言結構(如,同時,等)不打算作爲編程語言。這是一個調用工具的環境。通常情況下,如果你發現自己在shell中編寫一個循環,你就錯過了一個觀點,並且有一個更適合工作的工具。當您創建/銷燬/等待進程或創建/刪除/移動文件時,會有例外情況。所以,讀一本書外殼,如果你喜歡,但投入更多的時間學習,你從shell調用的工具,使用awk是用於降壓最大的爆炸。 – 2013-05-07 15:32:31