2016-11-16 71 views
0

輸入文件是以下,如何使用grep或awk或sed ..根據模式打印值?

192.168.2.4,21/TCP // ftp的///,23/TCP // SSH ///

192.168.2.5,53/TCP // DNS ///,80/TCP // /// HTTP

當我把 'FTP' 作爲參數

,輸出應該是

192.168.2.4,21/TCP // FTP///

把 'FTP SSH',輸出應該是

192.168.2.4,21/TCP // /// FTP,23/TCP // /// SSH

我試着在awk grep egrep到目前爲止,但結果並不合適。

grep:我試過grep -o -e「pattern1」-e「pattern2」 這種方法只會打印出匹配的值,並帶有麻煩的換行符。

awk:我試圖通過「,」將行拆分爲列,並且對於列2到行尾,只打印匹配的值。 (只是一個想法,在網上找不到任何例子)

謝謝!

+1

是什麼?你嘗試至今不工作? –

+0

這不是一個編程服務。我們可以幫助您瞭解您需要做的事情,但不要僅僅說明問題並詢問:「請爲我解決這個問題」。 – chw21

+0

@ chw21對不起,這是一個錯字 –

回答

0

此代碼將實現你想要的,雖然它不是超優雅:

grep -e "ftp" /folder/log | sed 's/ftp\/\/\/.*/ftp\/\/\//' 

grep -e "ftp" /folder/log | grep -e "ssh" | sed 's/ssh\/\/\/.*/ssh\/\/\//' 

的代碼假設三個斜槓(///)模式作爲分隔符之後,因此將正常工作只要你的模式總是跟着///。該代碼還假定第二個模式將總是在該行的第一個模式之後列出(例如:在這種情況下,您希望ftp將總是首先在ssh上顯示)。

+0

感謝您的回覆:)我認爲grep是基於行,一旦匹配的第一個模式,輸出將是完整的行。我也嘗試了-o選項,它只會返回我剛剛注意到的匹配值 –

+0

;你希望代碼將匹配打印到最後一次模式匹配,因爲分隔符是空格嗎? –

+0

好的,我更新了我的答案。我使用三個正斜槓作爲分隔符(///)。 –

0

您能使用cut嗎? -

grep "ftp" /your/file | cut -d, -f1-2 
0

保存在一個文件下面的腳本,並調用它:

awk -v re="http|ssh" -f script input 

腳本:

BEGIN{ 
     FS="," 
} 
{ 
     printf "%s", $1; 
     for(i=2; i<=NF; i++) 
       if ($i ~ re) 
         printf ",%s",$i; 
     printf "\n" 
}