分类目录归档:shell script

AWK格式化输出printf()函数

                        

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: 
printf("", ); 
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。
%d 十进制有符号整数 
%u 十进制无符号整数 
%f 浮点数 
%s 字符串 
%c 单个字符 
%p 指针的值 
%e 指数形式的浮点数 
%x, %X 无符号以十六进制表示的整数 
%0 无符号以八进制表示的整数 
%g 自动选择合适的表示法 
\n 换行 
\f 清屏并换页 
\r 回车 
\t Tab符 
\xhh 表示一个ASCII码用16进表示,其中hh是1到2个16进制数 

说明: 
(1). 可以在"%"和字母之间插进数字表示最大场宽。 
例如: %3d 表示输出3位整型数, 不够3位右对齐。 
%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐。 
%8s 表示输出8个字符的字符串, 不够8个字符右对齐。 
如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出.但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出.
另外, 若想在输出值前加一些0, 就应在场宽项前加个0。 
例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。 
如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,小数点前的数字代表最小宽度。 
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

(2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。 
例如: %ld 表示输出long整数 
%lf 表示输出double浮点数 

(3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。 
例如: %-7d 表示输出7位整数左对齐 
%-10s 表示输出10个字符左对齐 

例子:
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.5G  2.1G  7.0G  23% /
/dev/sda5             1.9G   36M  1.8G   2% /home
/dev/sda3             7.0G  145M  6.5G   3% /test
/dev/sda1              99M   12M   83M  13% /boot
tmpfs                 252M     0  252M   0% /dev/shm
/dev/sdb1             380M  117M  244M  33% /backup
/dev/sdb2             618M   17M  570M   3% /ros

$ df -h|awk '{printf ("%12s\n",$1)}'
   Filesystem
   /dev/sda2
   /dev/sda5
   /dev/sda3
   /dev/sda1
       tmpfs
   /dev/sdb1
   /dev/sdb2
该命令就以12个字符串为格式,不够的空格不足,右对齐。

$ df -h|awk '{printf ("%-12s\n",$1)}'
Filesystem  
/dev/sda2   
/dev/sda5   
/dev/sda3   
/dev/sda1   
tmpfs       
/dev/sdb1   
/dev/sdb2   
同上,以左对齐。

例子:
$ echo "1.7 2.52" | awk '{printf ("%d\n",$2)}'
2
#整数换行输出第2个域

$ echo "1.7 2.52" | awk '{printf ("%f\n",$1)}'
1.700000
#浮点换行输出第1个域

$ echo "1.5" | awk '{printf ("%.f\n",$1)}'     
2
$ echo "1.4" | awk '{printf ("%.f\n",$1)}'      
1
#四舍五入输入整数


$ echo "1.7 2.52" | awk '{printf ("%3.1f\n",$2)}'
2.5
#以3位长度、1位小数,"."占一位,浮点换行输出第2个域(四舍五入)。

$ echo "1.7 2.52" | awk '{printf ("%6.3f\n",$2)}'
 2.520
#以6位长度,其中整数占2位,不足2位空格补足,“.”占一位,小数占3位,不足3位用0补足。

$ echo "1.7 2.52" | awk '{printf ("%e\n",$1)}'
1.700000e+00
#指数形式的浮点数输出。

$ echo "123 1" | awk '{printf("%d\t%03d\n",$1,$2)}'
123     001
#用0补充格式

                                  

常用正则表达式

 

 

一、校验数字的表达式

 

      

  • 数字:^[0-9]*$
  •   

  • n位的数字:^\d{n}$
  •   

  • 至少n位的数字:^\d{n,}$
  •   

  • m-n位的数字:^\d{m,n}$
  •   

  • 零和非零开头的数字:^(0|[1-9][0-9]*)$
  •   

  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  •   

  • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
  •   

  • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
  •   

  • 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
  •   

  • 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
  •   

  • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
  •   

  • 非零的负整数:^\-[1-9][]0-9″*$ 或 ^-[1-9]\d*$
  •   

  • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
  •   

  • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  •   

  • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
  •   

  • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
  •   

  • 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  •   

  • 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
  •   

  • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
  •  

 

二、校验字符的表达式

 

      

  • 汉字:^[\u4e00-\u9fa5]{0,}$
  •   

  • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  •   

  • 长度为3-20的所有字符:^.{3,20}$
  •   

  • 由26个英文字母组成的字符串:^[A-Za-z]+$
  •   

  • 由26个大写英文字母组成的字符串:^[A-Z]+$
  •   

  • 由26个小写英文字母组成的字符串:^[a-z]+$
  •   

  • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  •   

  • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
  •   

  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  •   

  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  •   

  • 可以输入含有^%&’,;=?$\”等字符:[^%&',;=?$\x22]+
  •   

  • 禁止输入含有~的字符:[^~\x22]+
  •  

 

三、特殊需求表达式

 

      

  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  •   

  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  •   

  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  •   

  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  •   

  • 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  •   

  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  •   

  • 身份证号(15位、18位数字):^\d{15}|\d{18}$
  •   

  • 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  •   

  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  •   

  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  •   

  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  •   

  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  •   

  • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
  •   

  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  •   

  • 钱的输入格式:
       

          

    • 有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00″, 和没有 “分” 的 “10000″ 和 “10,000″:^[1-9][0-9]*$
    •     

    • 这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
    •     

    • 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
    •     

    • 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
    •     

    • 必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10″ 和 “10.2″ 是通过的:^[0-9]+(.[0-9]{2})?$
    •     

    • 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
    •     

    • 这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
    •     

    • 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
    •     

    • 备注:这就是最终结果了,别忘了”+”可以用”*”替代。如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
    •    

  •   

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  •   

  • 中文字符的正则表达式:[\u4e00-\u9fa5]
  •   

  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  •   

  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  •   

  • HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
  •   

  • 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  •   

  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  •   

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  •   

  • IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
  •   

  • IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
  •