2011-05-31 39 views
2

我有一個文件(通常會這樣做)與日期* nix時間爲從紀元秒,其次是一個消息,最後一個「線程」字段,我想選擇。所有用'|'隔開如從源碼DB導出...Sed打印與評估日期命令在回參考

例如

1306003700|SENT|21 
1277237887|SENT|119 
1274345263|SENT|115 
1261168663|RECV|21 
1306832459|SENT|80 
1306835346|RECV|80 

基本上,我可以用sed容易夠選擇並匹配「線程」字段,打印線,並打印與消息的各個時間,從而:

> cat file | sed -n "s/^\([0-9]*\)\|\(.*\)\|80$/\1 : \2/p" 
1306832459 : SENT 
1306835346 : RECV 

但我真正想要做的是還通過UNIX date命令打發時間字段,所以:

> cat file | sed -n "s/^\([0-9]*\)\|\(.*\)\|80$/`date -r \1` : \2/p" 

但是這似乎並不奏效 - 儘管它好像接受它。它只是打印出相同的(Epoch開始日期)日期:

Thu 1 Jan 1970 01:00:01 BST : SENT 
Thu 1 Jan 1970 01:00:01 BST : RECV 

如何評估/內插反向參考\ 1到日期命令?

也許sed的不匹配這些線(在一氣呵成格式化輸出)的方式......

回答

1

Perl是得心應手的位置:

perl -MPOSIX -F'\|' -lane ' 
    next unless $F[2] == "80"; 
    print(strftime("%Y-%m-%d %T", localtime $F[0]), " : ", $F[1]) 
' input.file 
+0

正如它所說的那樣工作。不是很緊湊 - 但很好的perl。 – timlukins 2011-06-01 07:59:46

4

AWK是爲這個完美的。

awk -F"|" '$3 == '80' { print system("date -r " $1), ":", $2 }' myfile.txt 

應工作(不能保證系統調用是正確的,雖然,沒有測試)

+0

我喜歡它的「單行」方面 - 但是,系統調用似乎直接打印在換行符上,並且(奇怪)返回代碼在冒號前打印(零)爲$ 1。例如 2011年5月31日16:18:08 BST ** \ n ** 0:發送** \ n ** – timlukins 2011-06-01 07:52:51

+0

@Tim不幸的是我不知道如何改變這種行爲。 Perl可能是更好的選擇 – 2011-06-01 13:56:57

+0

是的 - 沒有問題。因爲我總是喜歡awk和sed這些東西的簡潔,但是這似乎是他們如何能夠進一步指揮的缺陷。現在將使用Perl。 – timlukins 2011-06-02 12:57:44

0

使用AWK

$(awk -F'|' '/80$/{printf("echo $(date -d @%s) : %s;",$1,$2);}' /path/to/file) 
0

date命令將在sed命令之前執行。

這個工作可能是最簡單的perl或python,否則你可以使用某種形式的bash循環。

3

這純粹慶典

wanted=80 
(IFS=\|; while read sec message thread 
do 
     [[ $thread == $wanted ]] && echo $(date -r $sec) : $message 
done) < datafile.txt 

打印

Tue May 31 11:00:59 CEST 2011 : SENT 
Tue May 31 11:49:06 CEST 2011 : RECV 

你可以給變量 「」 爲更好的安全性...

1

這可能會爲你工作:

sed -n 's/^\([0-9]*\)|\(.*\)|80$/echo "$(date -d @\1) : \2"/p' file | sh 

,或者如果你有GNU的sed:

sed -n 's/^\([0-9]*\)|\(.*\)|80$/echo "$(date -d @\1) : \2"/ep' file 
0

靈感來自拉夫的回答以上:

awk -F"|" '$3 == '80' { system("date -d @" $1 " | tr -d \"\n\""); print " :", $2 }' myfile.txt 

對於我的版本日期,似乎-d是參數,而不是-r,並且它需要一個前導的@。這裏的另一個變化是執行system調用(所以日期實際上是打印,換行和全部 - 因此是tr)並返回退出代碼。我們並不在意打印退出代碼(0),因此我們將system呼叫移至任何awkprint s之外。