sed小结

1,

sed的追加、插入语法

文件
1
2
3
4
希望结果:
start
1
end
2
3
4

例如sed追加、插入参数,写成以下方式为什么会报错:
执行:sed  '/1/{a/start;i/end}' a.txt
报错:sed:-e 表达式 #1,字符 0:未匹配的“{”

 

sed -e '/1/i/start' -e '/1/a/end' file 

需要换行,a后面都会被当成被追加的内容

 

2,

用awk实现日期时间计算时间差


第一种情况:时间格式是yyyymmdd
例:今天是20110510,然后我输入一个时间,如20110605,计算是相差26天,但是用awk怎么实现计算两个时间日期之间相差26天?(5月有31日)

第二种情况:时间格式是yyyymmddhhmmss
例:今天是20110510000000,然后我输入一个时间,如20110605000000,计算是相差26天,但是用awk怎么实现计算两个时间日期之间相差26天?(5月有31日)

 

有个办法,mktime,计算从1970-1-1到现在的秒数,然后做个差,得出的值/3600就是2个之间的天数了。


 

awk -v s="20110510" -v t="20110605" 'BEGIN{"date +%s -d "s|getline a;"date +%s -d "t|getline b;print (b/3600-a/3600)/24}'

26

 

或者:

 

 

#!/bin/bash

function date2days {

    echo "$*" | awk '{

        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;

        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;

        print j

    }'

}


echo "Enter your date:"

read input

InpuDays=$(date2days ${input:0:4} ${input:4:2} ${input:6:2})

SysDays=$(date2days `date +"%Y %m %d"`)

let result=$InpuDays-$SysDays

echo $result

 

或者:

 echo "20110510000000"|awk '{gsub(/../,"& ");sub(/ /,"");print mktime($0)}'

1304956800

 echo "20110605000000"|awk '{gsub(/../,"& ");sub(/ /,"");print mktime($0)}'

1307203200

awk -v s="1304956800" -v t="1307203200" 'BEGIN{print (t/3600-s/3600)/24}'

26

 

使用Epoch进行日期时间转换和计算的几个小函数

当你遇到一个date命令不够强大的系统时,可以试试这几个小函数。

#日期转天数[code]function date2days {
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        print j
    }'
}
date2days `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`[/code]#天数转日期[code]function days2date {
    echo "$1" | awk '{
        a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; 
        d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
        dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
        printf ("%4d-%02d-%02d/n",yy,mm,dd)
    }'
}
days2date 14839[/code]#日期转分钟[code]function date2minutes {
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        j=j*1440+$4*60+$5
        print j
    }'
}
date2minutes `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`[/code]#分钟转日期[code]function minutes2date {
    echo "$1" | awk '{
        i=$1; nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24);
        a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; 
        d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
        dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
        printf ("%4d-%02d-%02d %02d:%02d/n",yy,mm,dd,hh,nn)
    }'
}
minutes2date 21369299[/code]#日期转秒数[code]function date2seconds {
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        j=j*86400+$4*3600+$5*60+$6
        print j
    }'
}
date2seconds `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`[/code]#秒数转日期[code]function seconds2date {
    echo "$1" | awk '{
        i=$1; ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24);
        a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; 
        d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
        dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
        printf ("%4d-%02d-%02d %02d:%02d:%02d/n",yy,mm,dd,hh,nn,ss)
    }'
}
seconds2date 1282157959[/code]#日期转毫秒[code]function date2milliseconds {
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        j=j*86400+$4*3600+$5*60+$6
        printf ("%d%s/n",j,$7)
    }'
}
date2milliseconds `echo "2010-08-18 18:59:19.073" | sed 's/-/ /g;s/:/ /g;s//./ /g'`[/code]#毫秒转日期[code]function milliseconds2date {
    echo "$1" | awk '{
        i=$1; ms=i%1000; i=int(i/1000); ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); 

i=int(i/24);
        a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; 
        d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
        dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
        printf ("%4d-%02d-%02d %02d:%02d:%02d.%03d/n",yy,mm,dd,hh,nn,ss,ms)
    }'
}
milliseconds2date 1282157959073[/code]应用实例:

4,sed匹配空格和/t
比如下面一行:
testcase    3    
this和3之间是任意个空格或者tab,用
^testcase[/t]*$
只能匹配到3前面的,

^testcase[/t]*3$
无法匹配。
[oracle@s12071 ~]$ sed -r 's/^test[/t| ]+/123456/' file
123456123
1234563
[oracle@s12071 ~]$ cat -A file
test      123$
test^I^I^I^I3$
[oracle@s12071 ~]$ 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值