2012-04-13 62 views
0

我需要幫助CSH/TCSH腳本中的字符串處理。 我知道基本處理,但需要幫助瞭解我們如何處理高級字符串操作要求。選擇性字符串操作

我有它的格式是這樣的一個日誌文件:

[的start_a]的

[END_A]

[START_B]

日誌信息

B的日誌信息

[END_B]

[START_C]的Ç

日誌信息

[END_C]

我的要求是選擇性地提取的開始和結束標籤之間的內容,並將它們存儲在一個文件中。 例如的start_a和END_A之間的內容將被存儲在A.log

回答

0

awk中可以同時做他們1:

cat log | awk '/[START_A]/,/[END_A]/' 
+0

謝謝,它的工作。 我喜歡你的答案,因爲它很容易理解。 – Ani 2012-04-13 08:20:20

+0

[UUoC](http://partmaps.org/era/unix/award.html#uucaletter) – 2012-04-13 16:30:44

+0

您可以使用正則表達式而不是靜態字符串一次完成所有選項。 – John3136 2012-04-13 21:39:17

1

這應該爲你工作:

awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' yourLog 

測試:

kent$ cat test 
    [START_A] 

    log info of A 

    [END_A] 

    [START_B] 

    log info of B 

    [END_B] 

    [START_C] 

    log info of C 

    [END_C] 


kent$ awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' test 

kent$ head *.txt 
==> A.txt <== 

    log info of A 


==> B.txt <== 

    log info of B 


==> C.txt <== 

    log info of C 
+0

嘿肯特,我試着運行你的例子,它運行時沒有提供任何錯誤,但未能生成所需的文件。 這可能是一個更好的解決方案,因爲我將運行一行命令而不是多個命令。 你能否解釋一下這個命令是如何工作的。我知道基本的awk,並會用一些解釋來理解概念。 謝謝! – Ani 2012-04-13 08:22:39

+0

這僅適用於單字符標記和單行日誌條目,但可以輕鬆修改爲更一般。 +1在任何情況下。 – 2012-04-13 16:35:45

0

這可能工作爲你:

sed '/.*\[START_\([^]]*\)\].*/s||/\\[START_\1\\]/,/\\[END_\1\\]/w \1.log|p;d' file | 
sed -nf - file 
+0

不適用於我。你能解釋你的命令背後的一個小概念嗎?我希望能夠了解你正在做的事情,並希望看到我做錯了什麼。 謝謝 – Ani 2012-04-13 08:25:29

+0

第一部分構建一個'sed'腳本,它將開始和結束分隔符之間的'file'部分寫入基於起始分隔符的日誌文件中。第二部分(在管道之後)讀取生成的sed腳本,並運行它以代替'file'。您可以將第一部分發送到文件'>文件。sed',然後像這樣對文件運行:'sed -fn file.sed file'。 – potong 2012-04-13 09:06:20