2014-10-16 207 views
0

我想匹配的模式和打印上面幾行,使用sed我能夠做到這一點,但在腳本中我不能通過。我得到下面它需要參數作爲命令如何避免這一點。sed無法識別的命令

這是我簡單的for循環腳本

#!/bin/sh 
for i in `cat test.txt` 
do 
echo "***************************************************************************" 
echo '\n' 
echo $i 
sed -n "'1,/$i/p' debug.log | tail -14" 
echo '\n' 
echo "***************************************************************************" 
done 

SED -n 「 '1/Ref555330/P' 的debug.log |尾-14」

Unrecognized command: '1,/Ref555330/p' debug.log | tail -14 

請指導我解決這個線程。

+0

什麼是'sed的-n「‘1/$ I/P’調試。日誌|尾巴-14「'應該這樣做? – anubhava 2014-10-16 19:08:48

+0

它將從匹配的模式中打印上面的13行。 – 2014-10-16 19:10:15

+0

您正在將sed「'1,/ $ i/p'debug.log | tail -14」作爲命令。刪除所有引號,並用雙引號包圍sed命令即「1,/ $ i/p」 – potong 2014-10-17 07:22:34

回答

2

給雙引號僅sed命令

sed -n "1,/$i/p" debug.log | tail -14 
+0

感謝它的工作,但是,有什麼錯誤sed有時它的打印13錯誤行甚至模式不匹配:-( – 2014-10-16 19:58:21

+0

當模式不匹配,'sed'傾向於將'1,/ pattern /'視爲'1,$' - 也就是說它只是打印整個文件,這會導致範圍指定模擬...這是因爲'sed'的工作方式從第一行開始,直到找到匹配的行,它會在每一行上執行請求的操作,但實際上並沒有試圖先找到該範圍 – twalberg 2014-10-16 20:31:55

+0

感謝您的詳細解釋,它確實有幫助 – 2014-10-16 22:20:58

0

sed的是不爲任何合適的工具涉及超過1線你寫在殼循環任何時候只處理文本你有錯誤的做法。看起來你有一個名爲test.txt的正則表達式文件,你想從其他文件debug.log獲得每個RE上面的14行。這只是一個簡單的awk命令,像這樣(未經檢驗的,因爲你沒有提供任何樣本輸入或預期輸出):

awk ' 
NR==FNR { res[$0]; next } 
{ 
    line[FNR] = $0 
    for (re in res) 
     if ($0 ~ re) 
      hit[FNR] 
    next 
} 
END { 
    for (i=1; i<=FNR; i++) { 
     if (i in hit) { 
      print "***************************************************************************" 
      for (j=i-14; j<=i; j++) 
       print line[j] 
      print "***************************************************************************" 
     } 
    } 
} 
' test.txt debug.log 
+0

它表示語法錯誤 awk:第6行附近的語法錯誤 awk:第6行附近的非法聲明 awk:第12行附近的語法錯誤 awk:非法statem ent near line 12 awk:第20行附近的語法錯誤 – 2014-10-16 20:06:07

+0

它是一個solaris機器 – 2014-10-16 20:06:46

+0

每當您收到錯誤消息時,這意味着您正在使用舊的,破損的awk(Solaris上的/ usr/bin/awk)。千萬不要使用awk,因爲它很老,很破碎。在Solaris上使用/ usr/xpg4/bin/awk或nawk。 – 2014-10-16 20:14:20

相關問題