2013-02-04 20 views
1

我有一個簡單的任務:sed的正則表達式有不同的情況

從這樣的輸出:

[[email protected]:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp 
Destination   Cookies       Created 
89.208.102.86.500  d0a641ed0aa7bfe9:7ae3428b08fab146 2013-02-04 15:32:18 

需要採取只有IP地址字符串和日期字符串(在不同的請求)。

對於IP我已經寫了下面的正則表達式:

[[email protected]:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/p' 
89.208.102.86 

但日期不起作用

[[email protected]:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\}\ \([0-9]\{2\}:\)\{2\}[0-9]\{2\}\)$/\2/p' 
[[email protected]:~]# 

不能明白的地方是錯誤?

我也想改變/(表達/)和/ {表達/}標誌使用-r,但不知道怎麼會做

預先感謝您

附: 我也知道替代變型:

[[email protected]:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp |awk -F\. '/[0-9]/ {print $1"."$2"."$3"."$4}' 
89.208.102.86 

[[email protected]:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | awk '/[0-9]/ {print $3 " " $4}' 
2013-02-04 15:32:18 

但我想這樣做的SED,爲我的未來hadrly任務。

回答

1

您可以使用下面的sed:

sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\} \)/\1/p' 

讓你的約會。

+0

謝謝你,我也有了解簡化我的表達式:'racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -rne's /^.*([0-9] {4}(\ - [0-9] {2}){2})/ \ 1/p'' –

1

如何:

# IP 
$ sed -rn '2s/\.[0-9]+ .*//p' file 
89.208.102.86 

# Date and time 
$ sed -rn '2s/(\S+\s+){2}//p' file 
2013-02-04 15:32:18 

# Just date 
$ sed -rn '2s/(\S+\s+){2}(\S+).*/\2/p' file 
2013-02-04 
1

對於IP像1.2.3.4是:

sed -n 's%\([0-9.]+\).*%\1%p' 
sed -rn 's%([0-9.]+).*%\1%p' 

和日期,它是:

sed -n 's%.*\ \([0-9-]\+\ [0-9:]\+\)%\1%p' 
sed -rn 's%.* ([0-9-]+ [0-9:]+)%\1%p' 

而且如果IP總是喜歡1.2.3.4.5(所以,第五個字段顯然是端口號)sed命令是:

sed -n 's%\([0-9.]\+\)\.[0-9]\+.*%\1%p' 
sed -rn 's%([0-9.]+)\.[0-9]+.*%\1%p' 
+0

您忘記將端口號從IP。 –

+0

我沒有認出.500作爲端口號。我認爲這是IP的一個錯字。好的,我將爲第五個字段又名端口號添加IP版本。 – erik

1

假設有一個在餅乾沒有空格,一個簡單的while read循環會做:

racoonctl ... | while read -r ip cookies date; do 
    # do something with "ip" and "date" 
    echo $ip 
    echo "$date" 
done 

如果你想扔掉的標題行

racoonctl ... | { 
    read header 
    while read -r ip cookies date; do 
     # do something with "ip" and "date" 
     echo $ip 
     echo "$date" 
    done 
}