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

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

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

终端实验代码

#awk内置变量[root@localhost ~]# more grade.txt11#senior22#junior33#senior44#senior55#junior66#junior77#junior88#senior[root@localhost ~]# awk -F '#' '{print NF,NR,$0}' grade.txt2 1 11#senior2 2 22#junior2 3 33#senior2 4 44#senior2 5 55#junior2 6 66#junior2 7 77#junior2 8 88#senior[root@localhost ~]# awk '{print NF,NR,$0}' grade.txt1 1 11#senior1 2 22#junior1 3 33#senior1 4 44#senior1 5 55#junior1 6 66#junior1 7 77#junior1 8 88#senior[root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0}' grade.txt2 1 root 11#senior2 2 root 22#junior2 3 root 33#senior2 4 root 44#senior2 5 root 55#junior2 6 root 66#junior2 7 root 77#junior2 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#junior2 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 2junior2 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 awk88#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.txt88#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.txt20220002[root@localhost ~]# awk -F '#' '{print (index("e",$2))}' grade.txt00000000[root@localhost ~]# awk -F '#' '{print (index($2,"s"))}' grade.txt10110001[root@localhost ~]# cat grade.txt11#senior22#junior33#senior44#senior55#junior66#junior77#junior88#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]}'3as[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"]=010 score["90-100"]=011 student["junior"]=012 student["senior"]=013 }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",$239  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 echo12 echo13 dis_mainmenu="CREATE MINISITE"14 curdate=`date "+%Y-%m-%d %T"`15 cat <<mayday16  DATE: $curdate17  ========================================18          $dis_mainmenu19  ========================================20  **21  ** 7) EXIT         **22  ========================================23 mayday24 }25 26 while [ $loopvar -gt 0 ]27 do28  main_menu29  echo -n " Please choose [1-7]:"30  read choose31  case $choose in32   7)33   exit34   ;;35   *)36   clear37   continue38   ;;39  esac40 done

转载于:https://www.cnblogs.com/zeedmood/archive/2012/03/06/2382481.html

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

  1. 嵌入式成长轨迹27 【Linux应用编程强化】【中嵌第二阶段】【进程管理】

    补充 成长轨迹19 进程操作 成长轨迹21 多线程编程 中的一些概念 不同之处:进程概念.进程基本状态(这里是最起码的状态).信号量机制 一 进程的基本概念 1  程序的顺序执行和并发执行 1).程序 ...

  2. 嵌入式成长轨迹33 【嵌入式学习阶段】【ARM环境调试】【在虚拟机下Ubuntu建立NFS网络文件系统】...

    更新版 http://www.cnblogs.com/zeedmood/archive/2012/12/08/2808376.html (以防参考资料链接无效,将所有参考文章都附后了,所以非常长;实际 ...

  3. 嵌入式成长轨迹34 【嵌入式学习阶段】【ARM环境调试】【QT 移植环境及简单程序示例】---补充《ok6410 Qt移植百科全书》...

    更新版 http://www.cnblogs.com/zeedmood/archive/2012/12/08/2808393.html 书上提及的有这些,分别说明下,里边打*可以不弄:   Tslib ...

  4. 嵌入式成长轨迹54 【Zigbee项目】【CC2430基础实验】【系统睡眠工作状态】

    本实验在小灯闪烁10 次以后进入低功耗模式 PM3 .CC2430 一共有4 种功耗模式,分别是PM0,PM1,PM2,PM3,以 PM3 功耗最低. SLEEP (0xBE) - Sleep mod ...

  5. 嵌入式成长轨迹53 【Zigbee项目】【CC2430基础实验】【串口时钟PC显示】

    void InitT1(void) : 函数原型: 1 void InitT1(void) 2 { 3 T1CCTL0 = 0X44; 4 //T1CCTL0 (0xE5) 5 //T1 ch0 中断 ...

  6. 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】

    最为简单的代码,只用到一个寄存器P1DIR.因为点亮的led灯(p1.0和p1.1)的管脚是p1的,要输出就得将这两个管脚设置为输出管脚.该寄存器用0~8对应1.0~1.8管脚. 1 //main.c ...

  7. 嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】...

    在PC上从串口向 CC2430发任意长度为 30 字节的字串,若长度不足 30 字节,则以"#"为字串末字节,CC2430在收到字节后会将这一字串从串口反向发向 PC,用串口助手可 ...

  8. 嵌入式成长轨迹61 【智能家居项目】【ARM 飞凌ok6410】【在虚拟机Ubuntu下NFS网络文件系统建立】...

    推荐阅读顺序: 基本环境搭建: [配置]在虚拟机Ubuntu下NFS网络文件系统建立 <ok6410 Qt移植百科全书> [配置]QT&QWT&sqlite3安装配置 这中 ...

  9. 嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...

    一   GTK+/Gnome开发简介 GTK+是一个用于创建图形用户界面(GUI)的图形库,它在功能上类似微软的MFC,为应用程序提供了一套与平台无关的图形用户接口.GTK+最初用于开发GIMP(Ge ...

最新文章

  1. 比赛-模拟赛 (17 Aug, 2018) (待施工)
  2. Visual Studio Code 中文设置教程
  3. 河南大学生带着捡来的妹妹求学12年
  4. AAAI 2019 Oral | 让TA说你想听的—基于音/视频特征解离的讲述者人脸生成
  5. statistics_level参数的介绍
  6. linux dump_stack
  7. stylelint rules
  8. ES6高级技巧(五)
  9. 又烧一辆!蔚来ES8维修时起火烧到只剩底盘 官方回应:已开启调查
  10. 《spring-boot学习》-10-RabbitMQ
  11. new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...
  12. java(22) - 异常详解
  13. 数据结构+算法+c++学习(写在前面)
  14. oracle vm virtualbox安装xp,如何在VirtualBox虚拟机中安装XP系统?
  15. 查看后台事务代码的方法
  16. 《浏览器播放RTSP方案》之 VLC插件播放RTSP视频流
  17. 【模块】ESP32连接PS4手柄
  18. 华师大计算机入门模拟卷,华东师范大学网络本科计算机基础考试大纲
  19. 广州计算机行业目前发展趋势,2019年中国广东电子制造业产业发展概况及发展趋势分析[图]...
  20. 【Unity】Inspector属性

热门文章

  1. 劲爆!java的学习网站
  2. 【深度学习】基于深度神经网络进行权重剪枝的算法(二)
  3. 交互式SQL(数据定义部分)
  4. 美国计算机专业录取率,美国留学高录取率院校计算机专业申请条件是什么? 爱问知识人...
  5. android+apk+反编译和再签名打包,Android:apk反编译步骤,打包、签名和逆向工程经验总结...
  6. python爬取动态网页图片_python爬虫之爬取动态加载的图片_百度
  7. js 数字相加_Python练习:解题 - 两数相加(JS, TS, PY3版)
  8. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释
  9. 网络营销外包期间站长如何挖掘用户真实需求探索网络营销外包真谛
  10. 提升软文营销曝光量可从这几方面着手操作