2011-09-08 61 views
1

我有一個類似如下的日誌文件:如何使用SED提取字符串多個params中,awk的

2010/01/12/ 12:00 some un related alapha 129495 and the interesting value 45pts 
2010/01/12/ 15:00 some un related alapha 129495 and no interesting value 
2010/01/13/ 09:00 some un related alapha 345678 and the interesting value 60pts 

我想繪製日期時間字符串VS使用gnuplot的有趣值。爲了做到這一點,我試圖解析上面的日誌文件,看起來像一個CSV文件(並非在日誌中的所有行都有可繪製的值):

2010/01/12/12:00,45

2010/01/13/14:00,60

我怎麼能做到這一點用awk或者sed?

我可以提取初始字符是這樣的:

cat partial.log | sed -e 's/^\(.\{17\}\).*/\1/' 

,但我怎麼能提取最終值?

我一直在試圖做到這一點無濟於事!

謝謝

+1

哦,順便說一句,[不要使用'cat'那樣](https://web.archive.org/web/20130307065129/http://partmaps.org/era/unix/award.html ) – carlpett

回答

1

Bash

#!/bin/bash 

while read -r a b line 
do 
    [[ $line =~ ([0-9]+)pts$ ]] && echo "$a $b, ${BASH_REMATCH[1]}" 
done < file 
0

確實有可能。一個正則表達式,如這一個,比如:

sed -n 's!([0-9]{4}/[0-9]{2}/[0-9]{2}/ [0-9]{2}:[0-9]{2}).*([0-9]+)pts!\1, \2!p' 
+0

當我執行上述我得到的錯誤: sed:1:「s!([0-9] {4}/[0-9] {2}/[0 ...」:\ 1未定義在RE 中,你能解釋命令試圖做什麼嗎? – chris

+0

它收集你感興趣的部分:'([0-9] {4}/[0-9] {2}/[0-9] {2}/[0-9] {2}:[0-9] {2})'是一個與你的日期字符串匹配的正則表達式,然後'。*'拋出任何東西直到一些數字後面跟着'pts' ,並保存這些數字,然後打印這兩個組,你使用的是什麼版本的「sed」? – carlpett

+0

使用gnu sed 4.2.1我得到錯誤: sed:-e表達式#1,字符71:無效的引用\ 2's'命令的RHS – chris

1

嘗試:

awk 'NF==12{sub(/pts/,"",$12);printf "%s %s, %s ", $1, $2, $12}' file 

輸入:

2010/01/12/ 12:00 some un related alapha 129495 and the interesting value 45pts 
2010/01/12/ 15:00 some un related alapha 129495 and no interesting value 
2010/01/13/ 09:00 some un related alapha 345678 and the interesting value 60pts 

輸出:

2010/01/12/ 12:00, 45 2010/01/13/ 09:00, 60 

更新了新的要求:

命令:

awk 'NF==12{gsub(/\//,"-",$1)sub(/pts/,"",$12);printf "%s%s %s \n", $1, $2, $12}' file 

輸出:

2010-01-12-12:00 45 
2010-01-13-09:00 60 

HTH克里斯

+0

對不起,我注意到這行在我的csv文件的寫入位置沒有被破壞,我已經修改了它,以便如何更改上面的awk程序以打印正確的csv文件? – chris

+0

此awk'NF == 12 {gsub(/ \ //,「 - 」,$ 1)sub(/ pts /,「」,$ 12); printf「%s%s%s \ n」,$ 1,$ 2, $ 12}'文件給我「2010-01-12-12:00 45 2010-01-13-09:00 60」換行符(此處未顯示)。 – Chris

+0

@Chris:編輯發佈的答案可能更好,並留下評論以指示編輯。祝你們好運! – shellter

0
awk '/pts/{ gsub(/pts/,"",$12);print $1,$2", "$12}' yourFile 

輸出:

2010/01/12/ 12:00, 45 
2010/01/13/ 09:00, 60 

[更新:根據您的新要求]

How can i modify the above to look like:

2010-01-12-12:00 45 
2010-01-13-09:00 60 
awk '/pts/{ gsub(/pts/,"",$12);a=$1$2OFS$12;gsub(/\//,"-",a);print a}' yourFile 

的CMD上述會給你:

2010-01-12-12:00 45 
2010-01-13-09:00 60 
+0

謝謝!剛剛意識到gnuplot期望值由一個空格分隔。我如何修改上面看起來像: 2010-01-12-12:00 45 2010-01-13-09:00 60 謝謝,我幾乎在那裏! – chris

+0

@norm,只需將print語句更改爲:'print $ 1,$ 2,$ 12'' - 刪除文字引用的逗號。 –

+0

@norm,看我更新的答案。 – Kent

0

sed可以變得更可讀:

nn='[0-9]+' 
n6='[0-9]{6}' 
n4='[0-9]{4}' 
n2='[0-9]{2}' 
rx="^($n4/$n2/$n2/ $n2:$n2) .+ $n6 .+ ($nn)pts$" 

sed -nre "s|$rx|\1 \2|p" file 

輸出

2010/01/12/ 12:00 45 
2010/01/13/ 09:00 60 
0

我會做,在兩級流水線,第一AWK然後用sed:

awk '$NF ~ /[[:digit:]]+pts/ { print $1, $2", "$NF }' | 
    sed 's/pts$//' 

通過使用$NF,而不是一個固定的數字,你的工作最終字段,而不管無關的文字是什麼樣子以及它佔據了多少字段。

相關問題