我有一个简单的任务:
从这样的输出:
[root@localhost:~]# 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,我写了以下正则表达式:
[root@localhost:~]# 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
但是对于日期不起作用
[root@localhost:~]# 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'
[root@localhost:~]#
无法理解错误在哪里?
另外我想使用flag -r更改/(表达式/)和/ {expression /},但不知道怎么做
提前谢谢
P.S。 我也知道替代变体:
[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp |awk -F\. '/[0-9]/ {print $1"."$2"."$3"."$4}'
89.208.102.86
[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | awk '/[0-9]/ {print $3 " " $4}'
2013-02-04 15:32:18
但是我想在sed上做这件事,因为我未来的任务很艰巨。
答案 0 :(得分:1)
您可以使用以下sed:
sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\} \)/\1/p'
得到你的约会。
答案 1 :(得分: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
答案 2 :(得分:1)
对于像1.2.3.4这样的IP,它是:
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'
答案 3 :(得分:1)
假设cookie中没有空格,一个简单的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
}