嵌入式成长轨迹11 【嵌入式环境及基础】【Linux shell深入】【深入讨论】

 

一、深入讨论awk
1、条件操作符
< >= <= == != 等符号在awk中都存在
~ 匹配正则表达式
!~不匹配正则表达式

2、逻辑操作符
&& || ! 也都是存在的

3、awk内置变量
ARGC  命令行参数个数
ARGV  命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS  设置输入域分隔符,等价于命令行-F选项
NF  浏览记录的域个数
NR  已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS  控制记录分隔符

终端实验代码

#awk内置变量
[root@localhost ~]# more grade.txt
11#senior
22#junior
33#senior
44#senior
55#junior
66#junior
77#junior
88#senior
[root@localhost ~]# awk -F '#' '{print NF,NR,$0}' grade.txt
2 1 11#senior
2 2 22#junior
2 3 33#senior
2 4 44#senior
2 5 55#junior
2 6 66#junior
2 7 77#junior
2 8 88#senior
[root@localhost ~]# awk '{print NF,NR,$0}' grade.txt
1 1 11#senior
1 2 22#junior
1 3 33#senior
1 4 44#senior
1 5 55#junior
1 6 66#junior
1 7 77#junior
1 8 88#senior
[root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0}' grade.txt
2 1 root 11#senior
2 2 root 22#junior
2 3 root 33#senior
2 4 root 44#senior
2 5 root 55#junior
2 6 root 66#junior
2 7 root 77#junior
2 8 root 88#senior
#
#下面格式很有些奇怪。。求解释
[root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0,FILENAME}' grade.txt
grade.txt1#senior
grade.txt2#junior
grade.txt3#senior
grade.txt4#senior
grade.txt5#junior
grade.txt6#junior
grade.txt7#junior
2 8 root 88#senior grade.txt
[root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0,FILENAME,ARGC}' grade.txt
grade.txt 2senior
grade.txt 2junior
grade.txt 2senior
grade.txt 2senior
grade.txt 2junior
grade.txt 2junior
grade.txt 2junior
2 8 root 88#senior grade.txt 2
[root@localhost ~]# awk -F '#' '{print $0,FILENAME,ARGC,ARGV[0]}' grade.txt
grade.txt 2 awk
grade.txt 2 awk
grade.txt 2 awk
grade.txt 2 awk
grade.txt 2 awk
grade.txt 2 awk
grade.txt 2 awk
88#senior grade.txt 2 awk
[root@localhost ~]# awk -F '#' '{print $0,FILENAME,ARGC,ARGV[1]}' grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
grade.txt 2 grade.txt
88#senior grade.txt 2 grade.txt

 

 

 


4、字符串函数

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
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

终端实验代码

#字符串函数
[root@localhost ~]# awk -F '#' '{print (index($2,"e"))}' grade.txt
2
0
2
2
0
0
0
2
[root@localhost ~]# awk -F '#' '{print (index("e",$2))}' grade.txt
0
0
0
0
0
0
0
0
[root@localhost ~]# awk -F '#' '{print (index($2,"s"))}' grade.txt
1
0
1
1
0
0
0
1
[root@localhost ~]# cat grade.txt
11#senior
22#junior
33#senior
44#senior
55#junior
66#junior
77#junior
88#senior

 

 


5、awk转义字符
\" \"(双引号)标记
\/ /(斜杠)字符
\ ddd 其编码由 1、2 或 3 位八进制整数表示的字符,其中 d 表示一个八进制数位
\\ \ ( 反斜杠 ) 字符
\a 警告字符
\b 退格字符
\f 换页字符
\n 换行字符(请参阅以下的注)
\r 回车字符
\t 跳格字符
\v 垂直跳格

6、printf修饰符
这个跟c语言很像,估计c就是从这里学的。。。
%c ASCII字符
%d 整数
%e 浮点数,科学计数法
%f 浮点数
%g awk决定使用那种浮点数转换e或者f
%o 八进制
%s 字符串
%x 十六进制

7、awk数组
数组初始为空且它们大小可动态更改。数组由一个变量和在 [ ](方括号)中的下标来表示。下标或元素标识符可以是几个字符串,它们提供了一种相关数组能力。例如,程序:
/red/ { x["red"]++ }
/green/ { y["green"]++ }
增加 red 计数器和 green 计数器的计数。

数组可以用一个以上的下标来建立索引,类似于一些编程语言中的多维数组。因为 awk 命令的编程数组实际上是一维的,通过串联各独立表达式的字符串值(每个表达式由 SUBSEP 环境变量的值隔开)来将以逗号隔开的下标转换为单个字符串。所以,以下两个索引操作是等同的:
x[expr1, expr2,...exprn]

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

当使用 in 运算符时,一个多维 Index 值应包含在圆括号之中。除了 in 运算符,任何对不存在数组元素的引用将自动创建该元素。

终端实验代码

#数组
[root@localhost ~]# awk 'BEGIN {print split("as#qw#1234",array2,"#")}'
3
[root@localhost ~]# awk 'BEGIN {print split("as#qw#1234",array2,"#");print array2[1]}'
3
as
[root@localhost ~]# awk 'BEGIN {split("as#qw#1234",array2,"#");print array2[1],"\t",array2[2],"\t",array[3]}'
as qw
[root@localhost ~]# awk 'BEGIN {split("as#qw#1234",array2,"#");print array2[1],"\t",array2[2],"\t",array2[3]}'
as qw 1234

 

 


awk脚本例子
不知道为什么没有按我想象的输出,senior和junior都是0.。。

View Code
 1 #!/bin/awk -f
2 #awk_array.sh
3
4 BEGIN{
5 FS="#"
6 score["0-60"]=0
7 score["60-70"]=0
8 score["70-80"]=0
9 score["80-90"]=0
10 score["90-100"]=0
11 student["junior"]=0
12 student["senior"]=0
13 }
14
15 {
16 {if($1<60)
17 score["0-60"]++
18 }
19 {if($1<70 && $1>=60)
20 score["60-70"]++
21 }
22 {if($1<80 && $1>=70)
23 score["70-80"]++
24 }
25 {if($1<90 && $1>=80)
26 score["80-90"]++
27 }
28 {if($1<=100 && $1>=90)
29 score["90-100"]++
30 }
31 }
32 #我觉得是数据中的回车影响了输出
33 {
34 for(senior_junior in student)
35 {
36 if($2==senior_junior)
37 #{
38 #print $1,"\t",$2
39 student[seniot_junior]++
40 #}
41 }
42 }
43 #注意for外加括号
44 END{
45 {for(number in score) print "The score",number,"has",score[number],"students"}
46 {for (senior_junior in student) print "The class has",student[senior_junior],senior_junior,"students"}
47 }

 

 

二、深入讨论<<

典型用法:菜单输出
可以减轻程序员的工作量

脚本例子

 1 #!/bin/bash
2
3 loopvar=2
4
5 ###########
6 #main menu#
7 ###########
8
9 main_menu()
10 {
11 echo
12 echo
13 dis_mainmenu="CREATE MINISITE"
14 curdate=`date "+%Y-%m-%d %T"`
15 cat <<mayday
16 DATE: $curdate
17 ========================================
18 $dis_mainmenu
19 ========================================
20 **
21 ** 7) EXIT **
22 ========================================
23 mayday
24 }
25
26 while [ $loopvar -gt 0 ]
27 do
28 main_menu
29 echo -n " Please choose [1-7]:"
30 read choose
31 case $choose in
32 7)
33 exit
34 ;;
35 *)
36 clear
37 continue
38 ;;
39 esac
40 done

 

posted @ 2012-03-06 19:20  MooreZHENG  阅读(267)  评论(0编辑  收藏  举报