我需要幫助CSH/TCSH腳本中的字符串處理。 我知道基本處理,但需要幫助瞭解我們如何處理高級字符串操作要求。選擇性字符串操作
我有它的格式是這樣的一個日誌文件:
[的start_a]的
[END_A]
[START_B]
日誌信息
B的日誌信息
[END_B]
[START_C]的Ç
日誌信息
[END_C]
我的要求是選擇性地提取的開始和結束標籤之間的內容,並將它們存儲在一個文件中。 例如的start_a和END_A之間的內容將被存儲在A.log
我需要幫助CSH/TCSH腳本中的字符串處理。 我知道基本處理,但需要幫助瞭解我們如何處理高級字符串操作要求。選擇性字符串操作
我有它的格式是這樣的一個日誌文件:
[的start_a]的
[END_A]
[START_B]
日誌信息
B的日誌信息
[END_B]
[START_C]的Ç
日誌信息
[END_C]
我的要求是選擇性地提取的開始和結束標籤之間的內容,並將它們存儲在一個文件中。 例如的start_a和END_A之間的內容將被存儲在A.log
awk中可以同時做他們1:
cat log | awk '/[START_A]/,/[END_A]/'
這應該爲你工作:
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
嘿肯特,我試着運行你的例子,它運行時沒有提供任何錯誤,但未能生成所需的文件。 這可能是一個更好的解決方案,因爲我將運行一行命令而不是多個命令。 你能否解釋一下這個命令是如何工作的。我知道基本的awk,並會用一些解釋來理解概念。 謝謝! – Ani 2012-04-13 08:22:39
這僅適用於單字符標記和單行日誌條目,但可以輕鬆修改爲更一般。 +1在任何情況下。 – 2012-04-13 16:35:45
這可能工作爲你:
sed '/.*\[START_\([^]]*\)\].*/s||/\\[START_\1\\]/,/\\[END_\1\\]/w \1.log|p;d' file |
sed -nf - file
謝謝,它的工作。 我喜歡你的答案,因爲它很容易理解。 – Ani 2012-04-13 08:20:20
[UUoC](http://partmaps.org/era/unix/award.html#uucaletter) – 2012-04-13 16:30:44
您可以使用正則表達式而不是靜態字符串一次完成所有選項。 – John3136 2012-04-13 21:39:17