本节回顾下 date 和随机数的情况吧,前辈们写的都比较好,在此主要对以下几篇博文做简化与总结,方便以后适合自己回顾
重参博文:
1 》》Linux date命令及系统时间设置
2 》》我使用过的Linux命令之date - 显示、修改系统日期时间
3 》》Linux shell实现随机数的多种方法
4 》》Linux cksum用法
- 显示系统当前的时间
- date
- 显示目前的格林威治时间
- date -u
- 以指定的格式显示系统当前的时间
- date +Format
- date +%Y-%m-%d
Format的形式如下:
- %Y YYYY格式的年份(Year)
- %m mm格式的月份(),01-12
- %d dd格式的日期(day of month),01-31
- %H HH格式的小时数(),00-23
- %M MM格式的分钟数(),00-59
- %S SS格式的秒数(),00-59
- %p : 显示本地 AM 或 PM
%w 星期几,0-6,0表示星期天
%u 星期几,1-7,7表示星期天
%F YYYY-mm-dd格式的完整日期(Full date),同%Y-%m-%d
%T HH-MM-SS格式的时间(Time),同%H:%M:%S
%s 自1970年以来的秒数。
- %N 从上一秒开始到现在的纳秒数
注意以下大小写的区别:
- %a : 星期几 (Sun-Sat)
- %A : 星期几 (Sunday-Saturday)
- %b : 月份 (Jan-Dec)
- %B : 月份 (January-December)
- %c : 直接显示日期与时间
- %d : 日 (01-31)
- %D : 直接显示日期 (mm/dd/yy)
注意以上格式是可以任意组合的,还可以包括非格式串,比如 date “+今天是%Y-%d-%m,现在是$H:%M:%S”
- 显示用STRING指定的日期时间
- date -d STRING
- date –date=STRING
- date -d STRING +FORMAT
实例:
- 指定日期:date -d YYYY-mm-dd
- date -d “2011-12-23”
- 指定时间,日期是今天:date -d HH:MM:SS
- date -d “12:23:56”
- 指定日期时间:date -d “YYYY-mm-dd HH:MM:SS”
- date -d “2011-09-21 10:2:4”
- 指定1970年以来的秒数:
- date -d ‘1970-01-01 1251734400 sec utc’ (2009年 09月 01日 星期二 00:00:00 CST)
- 今天:date
- date -d today
- date -d now
- 几(n)天前:date -d “+n days ago”
- 几(n)天后 : date -d “-n days ago”
- 几(n)周前:date -d “+n weeks ago”
- 几(n)周后:date -d “-n weeks ago”
- 几(n)月前:date -d “+n months ago”
- 几(n)月后:date -d “-n months ago”
- 几(n)年前:date -d “+n years ago”
- 几(n)年后:date -d “-n years ago”
- 相应的有 时 分 秒
- 设置当前时间为STRING指定的日期时间。
- 格式:date -s STRING
- 格式:date –set=STRING
Linux 产生随机数
1. 通过时间获得随机数
$ date +%s
1287764773
#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
$ date +%N
738710457
#获得当前时间的纳秒数据,精确到亿分之一秒。
#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
$ date +%s%N
1287764807051101270
#这个可以说比较完美了,加入了时间戳,又加上了纳秒
1.2 通过时间来获得随机数。
#!/bin/sh
#获得随机数返回值,shell函数里算出随机数后,更新该值
function random(){
min=$1 #函数内建变量接受传入的第一个参数
max=$2 #函数内建变量接受传入的第二个参数
num=$(date +%s%N) #以时间戳和纳秒形式产生一个唯一数
retnum=$((num%max+nin)) #产生一个[min max]随机数
#进行求余数运算即可
echo $retnum
#这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
#还有一种返回,定义全价变量,然后函数改下内容,外面读取
}
#得到1-10的seq数据项
for i in {1..10}
do
out=$(random 11 20)//接受函数的标准输出
echo $i,"[11,20]",$out
done
2. 内部系统变量($RANDOM)
其实,linux已经提供有个系统环境变量了,直接就是随机数,
$ echo $RANDOM
#产生一个[0, 32767)随机数
$RANDOM * $max / 32767 + 1;
#产生一个[1, max) 随机数;
$RANDOM % 900 + 100
#产生一个三位数的随机数;
3. 读取linux 的uuid码
linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内,在使用hibernate 生成主键时,我们经常用这个,所以在这就不错介绍了;
$ cat /proc/sys/kernel/random/uuid
dff68213-b700-4947-87b1-d9e640334196
$ cat /proc/sys/kernel/random/uuid
7b57209a-d285-4fd0-88b4-9d3162d2e1bc
#连续2次读取,得到的uuid是不同的
$ cat /proc/sys/kernel/random/uuid| cksum | cut -d ' ' -f 1
2141807556
#同上方法得到随机整数