电子商务网站数据分析指标、名词定义与解析
网站分析采用指标可能有各种各样,根据网站目标和网站客户不同,可以有许多不同指标来衡量。常用网站分析指标有内容指标和商业指标,内容指标指是衡量访问者活动指标,商业指标是指衡量访问者活动转化为商业利润指标。
一、网站分析内容指标
转换率 Take Rates (Conversions Rates)
计算公式:转换率=进行了相应动作访问量/总访问量
指标意义:衡量网站内容对访问者吸引程度以及网站宣传效果
指标用法:当你在不同方测试新闻订阅、下载链接或注册会员,你可以使用不同链接名称、订阅方式、广告放置、付费搜索链接、付费广告(PPC)等等,看看那种方式是能够保持转换率在上升?如何增强来访者和网站内容相关性?如果这个值上升,说明相关性增强了,反之,则是减弱。
回访者比率 Repeat Visitor Share
计算公式:回访者比率=回访者数/独立访问者数
指标意义:衡量网站内容对访问者吸引程度和网站实用性(出自 业务员网:www.yewuyuan.com),你网站是否有令人感兴趣内容使访问者再次回到你网站。
指标用法:基于访问时长设定和产生报告时间段,这个指标可能会有很大不同。绝大多数网站都希望访问者回访,因此都希望这个值在不断提高,如果这个值 在下降,说明网站内容或产品质量没有加强。需要注意是,一旦你选定了一个时长和时间段,就要使用相同参数来产生你报告,否则就失去比较意义。
积极访问者比率 Heavy User Share
计算公式:积极用户比率=访问超过11页用户/总访问数
指标意义:衡量有多少访问者是对网站内容高度兴趣
指标用法:如果你网站针对正确目标受众并且网站使用方便,你可以看到这个指标应该是不断上升。如果你网站是内容型,你可以针对不同类别内容来区分不同积极访问者,当然你也可以定义20页以上才算是积极访问者。
忠实访问者比率 Committed Visitor Share
计算公式:访问时间在19分钟以上用户数/总用户数
指标意义:和上一个指标意义相同,只是使用停留时间取代浏览页数,取决于网站目标,你可以使用两个中一个或结合使用。
指标用法:访问者时长这个指标有很大争议,这个指标应结合其它指标一起使用,例如转换率,但总体来说,较长访问时长意味着用户喜欢呆在你网站,高忠实访问率当然是较好。同样,访问时长也可以根据不同需要自行设定。
忠实访问者指数 Committed Visitor Index
计算公式:忠实访问者指数=大于19分钟访问页数/大于19分钟访问者数
指标意义:指是每个长时间访问者平均访问页数,这是一个重要指标,它结合了页数和时间。
指标用法:如果这个指数较低,那意味着有较长访问时间但是较低访问页面(也许访问者正好离开吃饭去了)。通常都希望看到这个指数有较高值,如果你修改了网站,增加了网站功能和资料,吸引更多忠实访问者留在网站并浏览内容,这个指数就会上升。
忠实访问者量 Committed Visitor Volume
计算公式:忠实访问者量=大于19分钟访问页数/总访问页数
指标意义:长时间访问者所访问页面占所有访问页面数量
指标用法:对于一个靠广告驱动网站,这个指标尤其值注意,因为它代表了总体页面访问质量。如果你有10000访问页数却仅有1%忠实访问者率,这意味着你可能吸引了错误访问者,这些访问者没有啥价值,他们仅仅看一眼你网页就离开了。这是你应该考虑是否广告词语产生了误解。
访问者参与指数 Visitor Engagement Index
计算公式:访问者参与指数=总访问数/独立访问者数
指标意义:这个指标是每个访问者平均会话(session),代表着部分访问者多次访问趋势。
指标用法:与回访者比率不同,这个指标代表着回访者强烈度,如果有一个非常正确目标受众不断回访网站,这个指数将大大高于1;如果没有回访者,指数 将趋近于1,意味着每一个访问者都有一个新会话。这个指数高低取决于网站目标,大部分内容型和商业性网站都希望每个访问者在每周/每月有多个会话 (session);客户服务尤其是投诉之类页面或网站则希望这个指数尽可能接近于1。
回弹率(所有页面)Reject Rate/Bounce Rate
计算公式:回弹率(所有页面)=单页面访问数/总访问数
指标意义:代表着访问者看到仅有一页比率
指标意义:这个指标对于最高进入页面有很重要意义,因为流量就是从这些页面产生,当你对网站导航或布局设计进行调整时尤其要注意到这个参数。总而你是希望这个比率不断下降。
回弹率(首页)Reject Rate/Bounce Rate
计算公式:回弹率(首页)=仅仅访问首页访问数/所有从首页开始访问数
指标意义:这个指标代表所有从首页开始访问者中仅仅看了首页访问者比率
指标意义:这个指标是所有内容型指标中最重要一个,通常我们认为首页是最高进入页面(当然,如果你网站有其他更高进入页面,那么也应该把它加入到追 踪目标中)。对任意一个网站,我们可以想象,如果访问者对首页或最常见进入页面都是一掠而过,说明网站在某一方面有问题。如果针对目标市场是正确,说明是 访问者不能找到他想要东西,或者是网页设计上有问题(包括页面布局、网速、链接文字等等);如果网站设计是可行易用,网站内容可以很容易找到,那么问题可 能出在访问者质量上,即市场问题。
浏览用户比率 Scanning Visitor Share
计算公式:浏览用户比率=少于1分钟访问者数/总访问数
指标意义:这个指标一定程度上衡量网页吸引程度。
指标用法:大部分网站都希望访问者停留超过一分钟,如果这个指标值太高,那么就应该考虑一下网页内容是否过于简单,网站导航菜单是否需要改进。
浏览用户指数 Scanning Visitor Index
计算公式:浏览用户指数=少于1分钟访问页面数/少于1分钟访问者数
指标意义:一分钟内访问者平均访问页数
指标用法:这个指数也接近于1,说明访问者对网站越没兴趣,他们仅仅是瞄一眼就离开了。这也许是导航问题,如果你对导航系统进行了显著改进,应该可以看到这个指数在上升;如果指数还是下降,应该是网站目标市场及使用功能有问题,应该着手解决。
将浏览用户比率和浏览用户指数结合起来使用,可以看出用户是在浏览有用信息还是厌烦而离开。
浏览用户量 Scanning Visitor Volume
计算公式:浏览用户量=少于1分钟浏览页数/所有浏览页数
指标意义:在一分钟内完成访问页面数比率
指标用法:根据网站目标不同,这个指标高低有不同要求,大部分网站希望这个指标降低。如果是搞广告驱动网站,这个指标太高对于长期目标是不利,因为这意味着尽管你通过广告吸引了许多访问者,产生很高访问页数,但是访问者质量却是不高,所能带来收益也就会受到影响。
二、网站分析商业指标
平均订货额 Average Order Amount (AOA)
计算公式:平均订货额=总销售额/总订货数
指标意义:用来衡量网站销售状况好坏
指标用法:将网站访问者转化为买家当然是很重要,同样重要是激励买家在每次访问是购买更多产品。跟踪这个指标可以找到更好改进方法。
转化率 Conversion Rate (CR)
计算公式:转化率=总订货数/总访问量
指标意义:这是一个比较重要指标,衡量网站对每个访问者销售情况
指标用法:通过这个指标你可以看到即使一些微小变化都可能给网站收入带来巨大变化。如果你还能够区分出新、旧访问者所产生订单,那么就可以细化这个指标,对新旧客户进行分别统计。
每访问者销售额 Sales Per Visit (SPV)
计算公式:每访问者销售额=总销售额/总访问数
指标意义:这个指标也是用来衡量网站市场效率
指标用法:这个指标和转化率差不多,只是表现形式不同。
单笔订单成本 Cost per Order (CPO)
计算公式:单笔订单成本=总市场营销开支/总订货数
指标意义:衡量平均订货成本
指标用法:每笔订单营销成本对于网站盈利和现金流都是非常关键。营销成本计算各人有不同标准,有些把全年网站营运费用摊入到每月成本中,有些则不这么做,关键要看那种最适合自己情况。如果能够在不增加市场营销成本情况下提高转化率,这个指标就应该会下降。
再订货率 Repeat Order Rate (ROR)
计算公式:再订货率=现有客户订单数/总订单数
指标意义:用来衡量网站对客户吸引力
指标用法:这个指标高低和客户服务有很大关系,只有满意用户产品体验和服务才能提高这个指标。
单个访问者成本 Cost Per Visit (CPV)
计算公式:单个访问者成本=市场营销费用/总访问数
指标意义:用来衡量网站流量成本
指标用法:这个指标衡量是你市场效率,目标是要降低这个指标而提高SPV,为此要将无效市场营销费用削减,增加有效市场投入。
订单获取差额 Order Acquisition Gap (OAG)
计算公式:订单获取差额=单个访问者成本(CPV)-单笔订单成本(CPO)
指标意义:这是一个衡量市场效率指标,代表着网站所带来访问者和转化访问者之间差异
指标用法:指标值应是一个负值,这是一个测量从非访问者中获客户成本。有两种方法来降低这个差额,当你增强了网站销售能力,CPO就会下降,这个差 额就会缩小,说明网站转化现有流量能力到了加强;同样,CPV可能升高而CPO保持不变或降低,这个差额也会缩小,表明网站所吸引流量都具有较高转化率, 这种情形通常发生在启用了PPC(pay per click)计划。
订单获取率 Order Acquisition Ratio (OAR)
计算公式:订单获取率=单笔订单成本(CPO)/单个访问者成本(CPV)
指标意义:用另一种形式来体现市场效率
指标用法:用比率形式往往比较容易为管理阶层所理解,尤其是财务人员。
每笔产出 Contribution per Order (CON)
计算公式:每笔产出=(平均订货数X平均边际收益)-每笔订单成本
指标意义:每笔订单给你带来现金增加净值
指标用法:公司财务总监总是对这个指标感兴趣,代表了你花了多少钱来赚多少钱。
投资回报率 Return on Investment (ROI)
计算公式: 投资回报率=每笔产出(CON) /每笔订单成本 (CPO)
指标意义: 用来衡量你广告投资回报
指标用法:比较你广告回报率,应该把钱分配给有最高回报率广告,但是这个回报率应当要有时间段限制,比如“25% RIO/每周”和“25% RIO/每年”是有很大差别。
PHP对JSON处理数组的使用
对于JSON(JavaScript Object Notation)大家应该不陌生,它是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于 PHP的serialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。
先从JSON说起,看一个简单的实例。
例一:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
document.write(test.Name + ": " + test.Age);
显示结果:
变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。
当然也可以变得复杂些。
例二:
document.write(test.User.Name + ": " + test.Company);
显示结果:
这个例子中User元素中包含了Name和Age。
如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。
例三:
{"User":{"Name":"Peter","Age":20},"Company":"FORD"},
{"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
];
document.write(test[1].User.Name + ": " + test[1].Company);
//或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);
显示结果:
通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。
例四:
(
'Peter'=> array
(
'Country'=>'USA',
'Age'=>20
),
'Li Ming'=> array
(
'Country'=>'CHINA',
'Age'=>21
)
);
$serialize_var = serialize($arr);
echo $serialize_var;
显示结果:
这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:
a:2说明这是个有两个元素的数组(array),
s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),
后面i:20;也应该猜得到是整数(integer)20。
再来看一下这个例子,
例五:
{
var $var = 0;
function add(){
echo $var+10;
}
}
$unserialize_var = new test;
$serialize_var = serialize($unserialize_var);
echo $serialize_var;
$unserialize_var = null;
$unserialize_var = unserialize($serialize_var);
$unserialize_var->add();
显示结果:
10
从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法。
那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。
例六:
(
'Name'=>'Peter',
'Age'=>20
);
$jsonencode = json_encode($arr);
echo $jsonencode;
显示结果:
这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。
例七:
$jsondecode = json_decode($var);
print_r($jsondecode);
显示结果:
这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:
$jsondecode = json_decode($var,true);
print_r($jsondecode);
显示结果:
另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。
通过上面这些例子相信大家对于JSON和PHP的serialize、json_encode都有了初步了解,
结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互功能。
【Python】 如何解析json数据结构
一、JSON的格式:
1,对象:
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}
{ 属性 : 值 , 属性 : 值 , 属性 : 值 }
2,数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。
[
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"},
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}
]
3, 值可以是字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
4,json示例:
import json
# Converting Python to JSON
json_object = json.write( python_object )
# Converting JSON to Python
python_object = json.read( json_object )
5,simplejson 示例:
import simplejson
# Converting Python to JSON
json_object = simplejson.dumps( python_object )
# Converting JSON to Python
python_object = simplejson.loads( json_object )
二、python从web接口上查询信息
1,先看个例子
>>> import urllib
>>> url='http://a.bkeep.com/page/api/saInterface/searchServerInfo.htm?serviceTag=729HH2X'
>>> page=urllib.urlopen(url)
>>> data=page.read()
>>> print data //这个就是json的数据结构,str类型
{"total":1,"data":[{"outGuaranteeTime":"","assetsNum":"B50070100007003","cabinet":"H05","deviceModel":"PowerEdge 1950","hostname":"hzshterm1.alibaba.com","logicSite":"中文站","memoryInfo":{"amount":4,"size":8192},"ip":"172.16.20.163","isOnline":true,"useState":"使用中","serviceTag":"729HH2X","cpuInfo":{"amount":2,"masterFrequency":1995,"model":"Intel(R) Xeon(R) CPU E5405 @ 2.00GHz","coreNum":8,"l2CacheSize":6144},"cabinetPositionNum":"","buyTime":"2009-06-29","manageIp":"172.31.58.223","idc":"杭州德胜机房","responsibilityPerson":"张之诚"}],"errorMsg":"","isSuccess":true}
>>> type(data)
<type 'str'>
2,有了json数据结构,我却不知道怎么把它解析出来,幸亏有了李建辉的指导。大概思路是:
首先,json基本上是key/value的,python中就叫字典。既然是字典,那就应该安照读字典的方式去读。
将上面的data转为字典类型,这里用json模块的read方法。
>>> import json
>>> ddata=json.read(data)
>>> ddata
{'isSuccess': True, 'errorMsg': '', 'total': 1, 'data': [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]}
>>>
看看ddata已经是dict类型了
>>> type(ddata)
<type 'dict'>
其次,我们以读字典中key 为”data”对应的键值
>>> ddata['data'] //查看字典的方法!
[{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]
>>>type(ddata[‘data’])
<type 'list'>
发现ddata[‘data’]是一个列表,列表就要用序号来查询
>>> ddata['data'][0] //查看列表的方法!
{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}
>>>
呵呵,ddata[‘data’]列表的0号元素是个字典。。
好,那我们查查key为idc的键值是多少
>>> ddata['data'][0]['idc'] //查看字典的方法!
'\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf'
>>> print ddata['data'][0]['idc'] //呵呵,为什么print搞出来的是汉字呢?
杭州德胜机房
看到这里终于明白怎么解析json数据结构了。。。
那就是”一层一层往下剥”
Python的字符串操作
1.python字符串通常有单引号('...')、双引号("...")、三引号("""...""")或 ('''...''')包围,三引 号包含的字符串可由多行组成,一般可表示大段的叙述性字符串。在使用时基本没有差别,但双引号和三引号("""...""")中可以包含单引号,三引号 ('''...''')可以包含双引号,而不需要转义。
for i, j in {'chr':'\t', ':' : '\t', '..' : '\t'}.iteritems():
text = text.replace(i, j)
print text
1.复制字符串
#strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' print sStr2
2.连接字符串
#strcat(sStr1,sStr2) sStr1 = 'strcat' sStr2 = 'append' sStr1 += sStr2 print sStr1
3.查找字符
#strchr(sStr1,sStr2) sStr1 = 'strchr' sStr2 = 'r' nPos = sStr1.index(sStr2) print nPos
4.比较字符串
#strcmp(sStr1,sStr2) sStr1 = 'strchr' sStr2 = 'strch' print cmp(sStr1,sStr2)
5.扫描字符串是否包含指定的字符
#strspn(sStr1,sStr2) sStr1 = '12345678' sStr2 = '456' #sStr1 and chars both in sStr1 and sStr2 print len(sStr1 and sStr2)
6.字符串长度
#strlen(sStr1) sStr1 = 'strlen' print len(sStr1)
7.将字符串中的小写字符转换为大写字符
#strlwr(sStr1) sStr1 = 'JCstrlwr' sStr1 = sStr1.upper() print sStr1
8.追加指定长度的字符串
#strncat(sStr1,sStr2,n) sStr1 = '12345' sStr2 = 'abcdef' n = 3 sStr1 += sStr2[0:n] print sStr1
9.字符串指定长度比较
#strncmp(sStr1,sStr2,n) sStr1 = '12345' sStr2 = '123bc' n = 3 print cmp(sStr1[0:n],sStr2[0:n])
10.复制指定长度的字符
#strncpy(sStr1,sStr2,n) sStr1 = '' sStr2 = '12345' n = 3 sStr1 = sStr2[0:n] print sStr1
11.字符串比较,不区分大小写
#stricmp(sStr1,sStr2) sStr1 = 'abcefg' sStr2 = 'ABCEFG' print cmp(sStr1.upper(),sStr2.upper())
12.将字符串前n个字符替换为指定的字符
#strnset(sStr1,ch,n) sStr1 = '12345' ch = 'r' n = 3 sStr1 = n * ch + sStr1[3:] print sStr1
13.扫描字符串
#strpbrk(sStr1,sStr2) sStr1 = 'cekjgdklab' sStr2 = 'gka' nPos = -1 for c in sStr1: if c in sStr2: nPos = sStr1.index(c) break print nPos
14.翻转字符串
#strrev(sStr1) sStr1 = 'abcdefg' sStr1 = sStr1[::-1] print sStr1
15.查找字符串
#strstr(sStr1,sStr2) sStr1 = 'abcdefg' sStr2 = 'cde' print sStr1.find(sStr2)
16.分割字符串
#strtok(sStr1,sStr2) sStr1 = 'ab,cde,fgh,ijk' sStr2 = ',' sStr1 = sStr1[sStr1.find(sStr2) + 1:] print sStr1
shell的时间操作
#man date可以看到date的help文件
#date 获取当前时间
#date -d "-1 week" +%Y%m%d 获取上周日期(day,month,year,hour)
#date --date="-24 hour" +%Y%m%d 同上
date_now=`date +%s` shell脚本里面赋给变量值
%% 输出%符号
%a 当前域的星期缩写 (Sun..Sat)
%A 当前域的星期全写 (Sunday..Saturday)
%b 当前域的月份缩写(Jan..Dec)
%B 当前域的月份全称 (January..December)
%c 当前域的默认时间格式 (Sat Nov 04 12:02:33 EST 1989)
%C n百年 [00-99]
%d 两位的天 (01..31)
%D 短时间格式 (mm/dd/yy)
%e 短格式天 ( 1..31)
%F 文件时间格式 same as %Y-%m-%d
%h same as %b
%H 24小时制的小时 (00..23)
%I 12小时制的小时 (01..12)
%j 一年中的第几天 (001..366)
%k 短格式24小时制的小时 ( 0..23)
%l 短格式12小时制的小时 ( 1..12)
%m 双位月份 (01..12)
%M 双位分钟 (00..59)
%n 换行
%N 十亿分之一秒(000000000..999999999)
%p 大写的当前域的上下午指示 (blank in many locales)
%P 小写的当前域的上下午指示 (blank in many locales)
%r 12小时制的时间表示(时:分:秒,双位) time, 12-hour (hh:mm:ss [AP]M)
%R 24小时制的时间表示 (时:分,双位)time, 24-hour (hh:mm)
%s 自基础时间 1970-01-01 00:00:00 到当前时刻的秒数(a GNU extension)
%S 双位秒 second (00..60);
%t 横向制表位(tab)
%T 24小时制时间表示(hh:mm:ss)
%u 数字表示的星期(从星期一开始 1-7)
%U 一年中的第几周星期天为开始 (00..53)
%V 一年中的第几周星期一为开始 (01..53)
%w 一周中的第几天 星期天为开始 (0..6)
%W 一年中的第几周星期一为开始 (00..53)
%x 本地日期格式 (mm/dd/yy)
%X 本地时间格式 (%H:%M:%S)
%y 两位的年(00..99)
%Y 年 (1970…)
例子:编写shell脚本计算离自己生日还有多少天?
read -p "Input your birthday(YYYYmmdd):" date1
m=`date --date="$date1" +%m` #得到生日的月
d=`date --date="$date1" +%d` #得到生日的日
date_now=`date +%s` #得到当前时间的秒值
y=`date +%Y` #得到当前时间的年
birth=`date --date="$y$m$d" +%s` #得到今年的生日日期的秒值
internal=$(($birth-$date_now)) #计算今日到生日日期的间隔时间
if [ "$internal" -lt "0" ]; then #判断今天的生日是否已过
birth=`date --date="$(($y+1))$m$d" +%s` #得到明天的生日日期秒值
internal=$(($birth-$date_now)) #计算今天到下一个生日的间隔时间
fi
echo "There is :$((einternal/60/60/24)) days." #输出结果,秒换算为天
时间戳转换为系统时间:
date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z"
linux:vim 替换命令
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
* ************************************
1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
5. 删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,Linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
· 使用命令:cat filename1 | tr -d “^V^M” >newfile;
· 使用命令:sed -e “s/^V^M//” filename >outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
· :%s/^M$//g
如果上述方法无用,则正确的解决办法是:
· tr -d "r" <src >dest
· tr -d "5" dest
· strings A>B
6. 其它
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
麦肯锡公司在线刊物麦肯锡季刊的文章
https://china.mckinseyquarterly.com/home.aspx
麦肯锡公司在线刊物麦肯锡季刊的文章。商业管理战略 - 公司战略 - 全球商业战略
完全认识MySQL数据库中Show命令用法
MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法。
a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称。
b. show databases; -- 显示mysql中所有数据库的名称。
c. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。
d. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令。
e. show index from table_name; -- 显示表的索引。
f. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量。
g. show variables; -- 显示系统变量的名称和值。
h. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
i. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
j. show privileges; -- 显示服务器所支持的不同权限。
k. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。
l. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库。
m. show engies; -- 显示安装以后可用的存储引擎和默认引擎。
n. show innodb status; -- 显示innoDB存储引擎的状态。
o. show logs; -- 显示BDB存储引擎的日志。
p. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。
q. show errors; -- 只显示最后一个执行语句所产生的错误。
r. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。
查整个库的状态:
select concat(truncate(sum(data_length)/1024/1024,2),’MB’) as data_size, concat(truncate(sum(max_data_length)/1024/1024,2),’MB’) as max_data_size, concat(truncate(sum(data_free)/1024/1024,2),’MB’) as data_free, concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_size from information_schema.tables where TABLE_SCHEMA = ‘databasename’;
查数据库所有表信息:
SELECT * FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`='数据库名‘;
查单表:
select concat(truncate(sum(data_length)/1024/1024,2),’MB’) as data_size, concat(truncate(sum(max_data_length)/1024/1024,2),’MB’) as max_data_size, concat(truncate(sum(data_free)/1024/1024,2),’MB’) as data_free, concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_size from information_schema.tables where TABLE_NAME = ‘tablename’;