2014-01-05 77 views
1

我有一個文件(problem.txt)殼變量,其中每行具有時間戳開始在格式例如: 2014-01-05 00:00:49,908使含有時間戳SED

problem.txt內容:

2014-01-05 00:00:49,004 ABCDE DEF Sample1 THE END 
2014-01-05 00:00:51,037 ABCDE DEF Sample2 THE END 
2014-01-05 01:01:00,911 ABCDE DEF Sample3 THE END 
2014-01-05 01:30:49,747 ABCDE DEF sample4 THE END 
2014-01-05 02:00:00,475 ABCDE DEF sample5 THE END 
2014-01-05 03:00:00,037 ABCDE DEF sample6 THE END 

手頭的任務是查找給定時間戳之間的所有行,其中開始和結束時間戳存儲在shell變量中($ searchstart0,$ searchend0)。

例如:

searchstart0=2014-01-05 00:00:49,004 
searchend0=2014-01-05 03:00:00,037 

此外,結果必須被存儲在文本文件(RESULTS.TXT)。 因此,我正在使用sed命令來完成上述任務。下面是命令

sed -n "/$searchstart0/ , /$searchend0/p" problem.txt > /home/abc/results.txt 

然而,在執行上述commnad生成的文本文件是空的,我看到以下消息:

sed -e expression #1, char 0:no previous regular expression 

此外,我試圖的執行使用單引號的命令,而不是雙引號但仍生成的文件是空的。 請讓我知道是否有任何可能的解決方案來完成任務。

+0

我認爲你需要將它們傳遞給之前引用shell變量SED。 – potong

+0

它是否必須是'sed'?這聽起來像'awk'對'> ='和'<='使用字符串比較更合適。 –

+0

也許你的'sed'扼住了逗號周圍的空格? – tripleee

回答

1

的問題是,searchstart0searchend0

$ searchstart0=2014-01-05 00:00:49,004 
-bash: 00:00:49,004: command not found 
$ searchend0=2014-01-05 03:00:00,037 
-bash: 03:00:00,037: command not found 
$ echo $searchstart0 | wc -c 
    1 
$ echo $searchend0 | wc -c 
    1 

由於在分配錯誤,沒有任何分配這些變量。因此,有效的變量進行評估後,您sed是這樣執行的:當第一種模式是空的提高

$ sed -n "// , //p" sample.txt 
sed: -e expression #1, char 0: no previous regular expression 

此錯誤消息。第二個被允許爲空,但它不會做你想要的,它就好像使用$作爲結束模式,打印從開始模式到文件結束的所有內容。

如果修復變量賦值,那麼你的腳本應該工作:

searchstart0='2014-01-05 00:00:49,004' 
searchend0='2014-01-05 03:00:00,037' 

順便說一句,你不需要,周圍的空間在你的sed表達,你可以這樣寫:

sed -n "/$searchstart0/,/$searchend0/p" problem.txt > /home/abc/results.txt 
1

您的sed呼叫沒有任何問題。
也許你沒有正確設置這兩個變量。由於文本中有空格(例如searchstart0="2014-01-05 00:00:51,037"),請確保將引號之間的值括起來,然後重試。

0

如果shell變量設置正確,給定的代碼應該工作的樣本數據很好,因爲引用的時間戳都出現在數據文件:

searchstart0="2014-01-05 00:00:49,004" 
searchend0="2014-01-05 03:00:00,037" 
sed -n -e "/$searchstart0/,/$searchend0/p" problem.txt 

輸出:

2014-01-05 00:00:49,004 ABCDE DEF Sample1 THE END 
2014-01-05 00:00:51,037 ABCDE DEF Sample2 THE END 
2014-01-05 01:01:00,911 ABCDE DEF Sample3 THE END 
2014-01-05 01:30:49,747 ABCDE DEF sample4 THE END 
2014-01-05 02:00:00,475 ABCDE DEF sample5 THE END 
2014-01-05 03:00:00,037 ABCDE DEF sample6 THE END 

然而,如果該請求是針對2014年1月5日00之間時間戳:00:00000和2014年1月5日02:00:00000,則sed將無法打印任何數據。你可以使用途徑,與awk

searchstart0="2014-01-05 00:00:00,000" 
searchend0="2014-01-05 02:00:00,000" 
awk "\$0 >= \"$searchstart0\" && \$0 < \"$searchend0\" { print }" problem.txt 

或者沒有反斜槓:

awk -v s0="$searchstart0" -v e0="$searchend0" '$0 >= s0 && $0 < e0 { print }' problem.txt 

輸出:

2014-01-05 00:00:49,004 ABCDE DEF Sample1 THE END 
2014-01-05 00:00:51,037 ABCDE DEF Sample2 THE END 
2014-01-05 01:01:00,911 ABCDE DEF Sample3 THE END 
2014-01-05 01:30:49,747 ABCDE DEF sample4 THE END 

這依賴於時間戳是在該行的開始;如果時間戳在數據文件的第5列和第6列中,則必須更加努力。

嚴格地說,{ print }可以省略; awk將它作爲一個模式的默認操作我希望還是明確