首页 > 代码库 > shell外部辅助命令

shell外部辅助命令

date

Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置。当Linux启动时,硬件时钟会去读取系统时钟的 设置,然后系统时钟就会独立于硬件运作。
Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock。

若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数

在linux shell编程中,经常用到日期的加减运算
以前都是自己通过expr函数计算,很麻烦
其实date命令本身提供了日期的加减运算
非常方便。例如:得到昨天的时间
date +%Y%m%d --date="-1 day"
date 用法: date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
date 可以用来显示或设定系统的日期与时间。
1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下:
% :  打印出 %
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区 %a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)

2.在设定时间方面
date -s //设置当前时间,只有root权限才能设置,其他只能查看。
date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期做更改
date -s “01:01:01 2008-05-23″ //这样可以设置全部时间
date -s “01:01:01 20080523″ //这样可以设置全部时间
date -s “2008-05-23 01:01:01″ //这样可以设置全部时间
date -s “20080523 01:01:01″ //这样可以设置全部时间

3.加减
date +%Y%m%d         //显示现在天年月日
date +%Y%m%d --date="+1 day"  //显示后一天的日期
date +%Y%m%d --date="-1 day"  //显示前一天的日期
date +%Y%m%d --date="-1 month"  //显示上一月的日期
date +%Y%m%d --date="+1 month"  //显示下一月的日期
date +%Y%m%d --date="-1 year"  //显示前一年的日期
date +%Y%m%d --date="+1 year"  //显示下一年的日期

或者更简单点的  date=`date -d -${t}day ‘+%Y%m%d‘` //为t为前几天

[root@Gman root]# date -d next-day +%Y%m%d
20060328
[root@Gman root]# date -d last-day +%Y%m%d
20060326
[root@Gman root]# date -d yesterday +%Y%m%d
20060326
[root@Gman root]# date -d tomorrow +%Y%m%d
20060328
[root@Gman root]# date -d last-month +%Y%m
200602
[root@Gman root]# date -d next-month +%Y%m
200604
[root@Gman root]# date -d next-year +%Y        
2007
date –s:按字符串方式修改时间
只修改日期,输入:date -s 2007-08-09
只修改时间,输入:date -s 14:15:00
同时修改日期时间,注意要加双引号,日期与时间之间有一空格,输入:
#date -s "2007-08-03 14:15:00"

注意 :当你不希望出现无意义的 0 时(比如说 1999/03/07),则可以在标记中插入 - 符号,比如说 date ‘+%-H:%-M:%-S‘ 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。
当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。

 

expr

expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
[root@localhost script]# expr 10 + 10
20
[root@localhost script]# expr 10 - 8
2
[root@localhost script]# expr 2 \* 3  反斜线屏蔽其特定含义
6
[root@localhost script]# expr 30 / 3 / 2
5

seq

用法:seq [选项]... 尾数
 或:seq [选项]... 首数 尾数
 或:seq [选项]... 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
 -f, --format=格式 使用printf 样式的浮点格式
 -s, --separator=字符串使用指定字符串分隔数字(默认使用:\n)
 -w, --equal-width 在列前添加0 使得宽度相同
     --help 显示此帮助信息并退出
     --version 显示版本信息并退出
如果省略了首数或者增量,则默认其值为1,即使这样尾数仍小于首数。
首数、增量和尾数均以浮点数形式解释。当首数小于尾数时增量一般为正值,
相反在首数大于尾数时增量一般为负数。
指定的格式必须适用于显示"double"类型的参数;当首数、增量和尾数均为指定
精确度的定点十进制数时默认为"%.精确度f",否则默认为"%g"。
从1循环到100的两种方法(bash 其它的shell没试过)
for x in `seq 1 100`;do echo $x;done
for x in {1..100};do echo $x;done
输出1-100中,不包含数字7,且不能被7整除的数
seq 100 | grep -v "7" | awk ‘$0%7!=0{print}‘

另外,不用 seq 的话还可以这样:
[root@ubuntu]# for i in {1..10};do echo $i;done
1 和 10 之间是两个半角的点

-f 最常用 , 例如一次制做 10 個名 dir001 , dir002 .. dir010 的目錄,它便很有用途,我們可以
這樣下一個命令便可了
seq -f ‘dir%03g‘ 1 10 | xargs mkdir

mkdir $(seq -f ‘dir%03g‘ 1 10)
它用的是 printf 的格式 , %03g‘ 代表以三位浮點數,以此方法,如用bash3 的 printf
也可作為等價命令
printf ‘dir%03d\n‘ {1..10} | xargs mkdir  或 mkdir `printf ‘dir%03d ‘ {1..10}`
awk 當然也可以
awk ‘BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}‘ | xargs mkdir
這樣會比寫一個腳本快, 不必寫成
for dir in 001 002 003 004 005 006 007 008 009 010
do
    mkdir dir${dir}
done
我也常用 seq 下載一些用數字的 jpeg , 只要格式有數字順序便可,尤以一些 xxx site  ;)
for i in `seq -f ‘%02g‘ 1 20`
do
  if ! wget -P $HOME/tmp -c [img]http://www.xxxsite.com/photo/$i.jpg[/img] ; then
     wget -P $HOME/tmp -c $_
  fi
done

-s 選項主要改變輸出的分格符, 預設是 \n , 就是 newline
如用 -s 便可改變 , 如
seq -s ‘ ‘ 1 10
1 2 3 4 5 6 7 8 9 10  , 以空格作為分格,

shell外部辅助命令