iT邦幫忙

0

sed指令取代的的問題

主要是分析lag
它的格式範例大致如下:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
5FE7D17E9DC    57621 Mon Mar 28 10:24:56  post@ccc.ddd.com
             (connect to aaa.ttt.org[xxx.xxx.xxx.xxx]: Connection refused)
                                         tata.bbs@aaa.ttt.org

現在要配合分析的程式把第三行的tata.bbs@aaa.ttt.org
改成 remote tata.bbs@aaa.ttt.org
remote和tata.bbs@aaa.ttt.org中間只有要空白隔開即可多少不個空白不重要
試著利用grep和sed是能夠抓到我要的東西並修改
一開始我的寫法是

grep -v '^$' maillist | grep -v '^[0-9A-Z]' | grep -v '(' | grep -v '^-' | sed 's/^/remote/g' > maillist2

但這樣寫是把我要的改的東西抓出來改好後輸出為maillist2
後來想到和原本的需求不同
應該要直接寫進log不影響原本的格式
也就是會變成

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
5FE7D17E9DC    57621 Mon Mar 28 10:24:56  post@ccc.ddd.com
             (connect to aaa.ttt.org[xxx.xxx.xxx.xxx]: Connection refused)
                                         remote tata.bbs@aaa.ttt.org

直接改掉應該要怎麼寫才好呢?
是否能夠把我之前用grep判斷出來的東西餵給sed?

1 個回答

8
逮丸逮丸
iT邦大師 1 級 ‧ 2011-04-06 00:03:47
最佳解答

您這log其實是postfix的 mailq 執行的結果,
也許您是要算mailq的情況吧?
就以您這很寬鬆的條件下:

lokicjn提到:
remote和tata.bbs@aaa.ttt.org中間只有要空白隔開即可多少不個空白不重要

所以用awk指令就可達成,甚至用不上regular expression:

<pre class="c" name="code">mailq | awk '{if (NR%4==0) {print "remote "$0} else {print $0}}'

出來的結果應該就符合您的需求。
因為mailq執行後您想要加remote的該行,
等於是每第四行要加上remote的字樣,
這樣可以很清楚地看出來:
<pre class="c" name="code">mailq | awk '{print NR$0}'

只要在每第四行做處理就好了。

所以用第一段的程式碼執行結果,會變成類似這樣子:

&lt;pre class="c" name="code">-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
5FE7D17E9DC    57621 Mon Mar 28 10:24:56  post@ccc.ddd.com
             (connect to aaa.ttt.org[xxx.xxx.xxx.xxx]: Connection refused)
remote                                          tata.bbs@aaa.ttt.org

應該餵給您另個解析程式,就符合想要的樣式。
所以用awk、從固定行數的特徵,就可解這問題。

我要發表回答

立即登入回答