RUI个人博客 首页>>Linux>>[原] Linux学习笔记之 awk内置的字符串函数 printf修饰符和格式 diff cmp (awk下部曲)

[原] Linux学习笔记之 awk内置的字符串函数 printf修饰符和格式 diff cmp (awk下部曲)


Linux学习笔记之 awk介绍 awk常用命令 awk内置变量 (awk上部曲)

http://www.5ibig.com/article/index/arcid/63.htm


目录:

5.awk操作符 赋值操作符   ?: 条件表达操作符  并、与、非   ~匹配   关系操作符   算术操作符   前缀和后缀  ++   
    --
6. 内置的字符串函数  gsub(r,s,t) 整个t中用s替代r  index(s,t) 返回s中字符串t的第一个位置  length      match(s,r)      split(s,a,fs)在fs上将s分成序列a   sub(r,s)   substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分  sprintf  
7.字符串屏蔽序列  \b退格  \t tab键  \f走纸换页  \ddd 八进制值  \n新行  \c任意其他特殊字符  \r 回车
8. printf修饰符和格式   %c ASCII字符  %d或i 整数   %e或E 浮点数   %f浮点数   %s字符串
9.awk内置数字函数  int(x)  sqrt(x)    exp(x)   log(x) sin(x)   cos(x)   atan2(y,x)  rand()
10. diff 比对两个档案的文件内容   
11. cmp 以'位'为单位去比对


5.awk操作符 

· =  +=  *=  /=   %=  ^= 赋值操作符
· ?:   条件表大操作符
· ||  &&  !    并、与、非
· ~  !~  匹配操作符,包括匹配和不匹配
· <  <=  ==  !=   >  >=   关系操作符
· +  -  *  /   %  ^   算术运算符
· ++  --   前缀和后缀
[root@RAC1 tmp]# awk 'BEGIN{a=3;print a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;a+=2;print a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;a*=2;print a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;a/=2;print a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;a%=2;print a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;a^=2;print a}'

[root@RAC1 tmp]# awk 'BEGIN{a=3;b=4;a>b?b=a:a=b;print a,b}'

[root@RAC1 tmp]# awk 'BEGIN{a=3;print a++;print ++a}'
[root@RAC1 tmp]# awk 'BEGIN{a=3;print --a;print a--;print --a}'

6. 内置的字符串函数  gsub(r,s,t) 整个t中用s替代r  index(s,t) 返回s中字符串t的第一个位置  length  match(s,r)  
    split(s,a,fs)在fs上将s分成序列a   sub(r,s)   substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分  sprintf  
gsub(r,s)
在整个 $0 中用 s 替代 r
gsub(r,s,t)
在整个 t 中用s 替代 r
index(s,t)
返回 s中字符串 t 的第一位置
length(s)
返回 s 长度
match(s,r)
测试 s 是否包含匹配 r 的字符串
split(s,a,fs)
在 fs 上将 s 分成序列 a
sub(r,s)
用$0 中最左边最长的子串替代 s
substr(s,p)
返回字符串s 中从p开始的后缀部分
substr(s,p,n)
返回字符串 s 中从p 开始长度为 n 的后缀部分
sprintf(fmt,exp)
返回经 fmt 格式化后的 exp
[root@RAC1 tmp]# awk 'gsub("good","GOOD")' greptest
[root@RAC1 tmp]# awk 'gsub("good","GOOD"){print $0}' greptest
[root@RAC1 tmp]# awk 'gsub(/good/,"GOOD"){print $0}' greptest 
[root@RAC1 tmp]# awk 'gsub(/good/,/GOOD/){print $0}' greptest 
[root@RAC1 tmp]# awk 'gsub(/good/,GOOD){print $0}' greptest 

[root@RAC1 tmp]# awk 'gsub("ou","OU",$2){print $0}' greptest 
[root@RAC1 tmp]# awk 'gsub("ou","OU",$2)' greptest 
[root@RAC1 tmp]# awk 'gsub("a","A",$2){print $0}' greptest

[root@RAC1 tmp]# awk '{print index($0,"good"),$0}' greptest 
[root@RAC1 tmp]# awk 'BEGIN{print index("I love you","ov")}'

[root@RAC1 tmp]# awk '{print length($0),NF,NR,$0}' greptest 

[root@RAC1 tmp]# awk '{print match($0,"good")}' greptest
[root@RAC1 tmp]# awk '{print index($0,"good")}' greptest 

[root@RAC1 tmp]# awk 'BEGIN{print match("ABCD","C")}'
[root@RAC1 tmp]# awk 'BEGIN{print index("ABCD","C")}'

[root@RAC1 tmp]# awk 'BEGIN{print split("0411-8888-6666",aa,"-")}'
[root@RAC1 tmp]# awk 'BEGIN{print split("0411-8888-6666",aa,"-");print aa[1],aa[2],aa[3]}'

[root@RAC1 tmp]# awk '{print sub("2","9"),$0}' llvar 
[root@RAC1 tmp]# awk 'gsub("2","9"){print $0}' llvar 

[root@RAC1 tmp]# awk '{sub("2","9",$6);print $0}' llvar 

[root@RAC1 tmp]# awk '{print substr($0,1,6)}' greptest 
[root@RAC1 tmp]# awk '{print substr($0,5,10)}' greptest 

[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%10.4f",3.1415926)}' 
[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%8d%8i",123,456789)}'
[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%-8d%-8i",123,456789)}'
[root@RAC1 tmp]# awk 'BEGIN{printf("%10.4f\n",3.1415926)}' 

7.字符串屏蔽序列  \b退格  \t tab键  \f走纸换页  \ddd 八进制值  \n新行  \c任意其他特殊字符  \r 回车
· \b 退格键          \t  tab键
· \f 走纸换页       \ddd  八进制值
· \n  新行
· \c 任意其他特殊字符,例如 \\ 为反斜线符号
· \r 回车键
8. printf修饰符和格式   %c ASCII字符  %d或i 整数   %e或E 浮点数   %f浮点数   %s字符串
修饰符
· - 左对齐
· Width  域的步长,用0表示0步长
· .prec 最大字符串长度,或小数点右边的位数
格式
%c               ASCII 字符
%d或i          整数
%e或E         浮点数,科学计数法
%f               浮点数,例如(123.4578)
%g              awk决定使用哪种浮点数转换e或者f
%o              八进制数
%s              字符串
%x              十六进制数
[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%10.4f",3.1415926)}' 
[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%8d%8i",123,456789)}'
[root@RAC1 tmp]# awk 'BEGIN{print sprintf("%-8d%-8i",123,456789)}'
[root@RAC1 tmp]# awk 'BEGIN{printf("%10.4f",3.1415926)}' 
[root@RAC1 tmp]# awk 'BEGIN{printf("%10.4f\n",3.1415926)}' 

9.awk内置数字函数  int(x)  sqrt(x)    exp(x)   log(x) sin(x)   cos(x)   atan2(y,x)  rand()
int(x)
求出x的整数部分,向0取整.eg:int(3.9)=3,int(-3.9)=-3
sqrt(x)
求出x正的平方根值。eg:sqrt(4)=2
exp(x)
求出 e 的x次方。eg:exp(2) 即是求 e的x次方
log(x)
求出 x 的自然对数
sin(x)
求出 x 的sine值,x 是弧度。
cos(x)
求出 x 的cosine 值,x 是弧度。
atan2(y,x)
求y/x 的arctangent值,所求出的值其单位是弧度。
rand(0
得到一个随机数(平均分布在0和1之间)
[root@RAC1 tmp]# awk 'BEGIN{a=9;print a/2;print int(a/2)}'
[root@RAC1 tmp]# awk 'BEGIN{print sqrt(9)}'
[root@RAC1 tmp]# awk 'BEGIN{print exp(2)}'  
      e是2.71828
[root@RAC1 tmp]# bc

[root@RAC1 tmp]# awk 'BEGIN{print log(7.38906)}'
[root@RAC1 tmp]# awk 'BEGIN{print log(exp(2))}'

[root@RAC1 tmp]# awk 'BEGIN{print sqrt(2)/2}'
[root@RAC1 tmp]# bc
[root@RAC1 tmp]# awk 'BEGIN{print sin(0.785398);print cos(0.785398)}'
[root@RAC1 tmp]# awk 'BEGIN{print atan2(1,1)}'
[root@RAC1 tmp]# awk 'BEGIN{print rand()}'

[root@RAC1 tmp]# awk '{$10=$5-$2;print $10;total+=$2}END{print total}' llvar 

[root@RAC1 tmp]# tail -n 4 /etc/passwd
[root@RAC1 tmp]# tail -n 4 /etc/passwd >>passwd
[root@RAC1 tmp]# usermod -c "test1" test1
[root@RAC1 tmp]# usermod -c "test2" test2
[root@RAC1 tmp]# usermod -c "test3" test3
[root@RAC1 tmp]# usermod -c "test4" test4
[root@RAC1 tmp]# tail -n 4 /etc/passwd >passwd
[root@RAC1 tmp]# cat -n passwd 

[root@RAC1 tmp]# vi passwd.awk
#!/bin/awk -f
#program: this script is used to print test*'s information
#history: 2016-2-2 Tyger Wang release 1.0

#print head
BEGIN{
FS=":"
print "======================="
print "Login name \t Full name \t UID \t GID \t Home dir \t Used shell"
print "======================="
}

#to print information
{
printf("%-10s\t%-10s\t%5d\t%5i\t%-14s\t%-14s\n",$1,$5,$3,$4,$6,$7)
}

#END information
END{
print "++++++++++++++++++++++++++++"
print "There are "NR" line information"
}

[root@RAC1 tmp]# ll passwd.awk
[root@RAC1 tmp]# chmod u+x passwd.awk 
[root@RAC1 tmp]# ll passwd.awk 
[root@RAC1 tmp]# ./passwd.awk passwd

10. diff 比对两个档案的文件内容   
diff [-bBi] from-file to-file

from-file
一个文件名,作为原始比对档案的文件名
to-file
一个文件名,作为目的比对档案的文件名
注意,from-file或to-file 可以 - 替代
- 代表 [Strandard input] 之意
-a
将所有文件当做文本文件来处理
-b
忽略空格造成的不同。
-B
忽略空行造成的不同
-c
使用纲要输出格式
-i 
忽略大小写的变化
[root@RAC1 tmp]# awk '{gsub("is","IS");print $0}' greptest >greptestawk
[root@RAC1 tmp]# cat -n greptestawk 
[root@RAC1 tmp]# diff greptest greptestawk 

11. cmp 以'位'为单位去比对
· cmp [-s] file1 file2
· diff 主要是以 '行' 为单位比对,cmp则是以'位'为单位去比对
· -s:Print nothing for differing files;return exit status only
[root@RAC1 tmp]# cmp greptest greptestawk 
[root@RAC1 tmp]# cmp -s greptest greptestawk 
[root@RAC1 tmp]# echo $?
[root@RAC1 tmp]# man cmp
昵  称:
邮  箱:
评论内容:
验 证 码:
可用[code][/code]插入代码
点击刷新验证码