前段时间看了一下awk的使用选项,字段变量,标准变量,操作运算符,正则表达式,数组和控制流,并且也附带着一些相关的案例,总的来说,在深入了解和使用AWK之后,还是带来了很多的便利,在处理文本的文件的时候提供了更多的思路和便捷,比如按需自定义打印文本显示格式,进行一些简单的数据处理,同时awk还有和shell,python,go一些编程语言类似的循环,条件,逻辑处理,以及一些内置的函数更方便的帮助在命令行完成一些文本处理工作。今天完成了awk剩余的一些知识点学习。

awk中的循环

FOR

格式: for(initialisation;condition;increment/decrement)action

for 语句首先执行初始化动作( initialisation ),然后再检查条件( condition )。如果条件为真,则执行动作( actio n ),然后执行递增( increment )或者递减( decrement )操作。只要条件为真循环就会一直执行。每次循环结束 都会进条件检查,若条件为假则结束 循环

awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }' # 注意这里是++i,不是i++

while

While 循环会一直执行动作直到逻辑条件为假为止,AWK 首先检查条件是否为真,若条件为真则执行动作。此过程一直重复直到条件为假时,则停止

awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }' # 等同上面的for语句

DO-WHILE

Do-While 循环与 While 循环相似,但是 Do-While 的条件测试放到了循环的尾部,在 do-while 循环中,无论条件是真是假,循环语句至少执行一次,执行后检查条件真假,使用格式如下:

do action

while (condition)

看一个案例:

awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'

break

break 用以结束循环过程

awk 'BEGIN {

sum = 0; for (i = 0; i < 20; ++i) {

sum += i; if (sum > 50) break; else print "Sum =", sum }

}'

continue

Continue 语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代。当我们希望跳过循环中某处数据 处理时就会用到 Continue

awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }'

EXIT

Exit 用于结束脚本程序的执行。该函数接受一个整数作为参数表示 AWK 进程结束状态。如果没有提供该参数,其默认状态为 0

awk 'BEGIN {    10022  12:34:02 

sum = 0; for (i = 0; i < 20; ++i) {

sum += i; if (sum > 50) exit(10); else print "Sum =", sum }

}'

Sum = 0

Sum = 1

Sum = 3

Sum = 6

Sum = 10

Sum = 15

Sum = 21

Sum = 28

Sum = 36

Sum = 45

root # echo ? #查看期退出的状态码为指定的10

10

内置函数

AWK 为程序开发者提供了丰富的内置函数。包括算术函数、字符串操作函数、时间操 作相关的函数、位操作函数以及其它各种各样的函数

算术函数

  • exp(expr) 返回自然数e的expr次幂

awk 'BEGIN{printf "The exponential value of 5 is %f.\n",exp(5)}'

  • int(expr) 返回数值expr的整数部分

awk 'BEGIN {printf "34.1212的整数部分是: %d",int(34.1212)}'

awk 'BEGIN {param=4.232;result=int(param);printf "整数部分是:%d",result}'

  • log(expr) 返回自然对数

  • rand() 函数返回一个大于等于 0 小于 1 的随机数 N(0<= N < 1)

  • sin(expr) 正弦函数返回角度 expr 的正弦值,角度以弧度为单位

  • sqrt(expr) 计算 expr 的平方根

  • srand([expr]) 使用种子值生成随机数,数值 expr 作为随机数生成器的种子值。如果没有指定 expr 的值则函数默认使 用当前系统时间作为种子值

awk 'BEGIN { param = 10

printf "srand() = %d\n", srand()

printf "srand(%d) = %d\n", param, srand(param) }'

字符串函数

  • asort(arr,[, d [,how] ]) 函数使用 GAWK 值比较的一般规则排序 arr 中的内容,然后用以 1 开始的有序整数替换排序内容的索引

注意mac上的awk 20070501版本没有该函数

awk 'BEGIN {

arr[0] = "Three"

arr[1] = "One"

arr[2] = "Two"

print "Array elements before sorting:";

for (i in arr) {

print arr[i]

}

asort(arr)

print "Array elements after sorting:"

for (i in arr) {

print arr[i]

}

}'

  • asorti(arr,[, d [,how] ]) asorti 函数的行为与 asort 函数的行为很相似,二者的差别在于 aosrt 对数组的值排序,而 asorti 对数组的索引 排序

  • gsub(regx,sub, string) gsub 是全局替换( global substitution )的缩写。它将出现的子串(sub)替换为 regx。第三个参数 string 是可 选的,默认值为 $0,表示在整个输入记录中搜索子串

awk '{gsub("172.16.132.148","0.0.0.0");print }' docker-compose.yml # 替换docker-compose.yml中的172.16.132.148为0.0.0.0

  • index(str,sub) index 函数用于检测字符串 sub 是否是 str 的子串。如果 sub 是 str 的子串,则返回子串 sub 在字符串 str 的开 始位置;若不是其子串,则返回 0。str 的字符位置索引从 1 开始计数

awk 'BEGIN {

str = "One Two Three"

subs = "Two"

ret = index(str, subs)

printf "Substring \"%s\" found at %d location.\n", subs, ret }'

  • length(str) 返回字符串的长度

  • match(str, regex) match 返回正则表达式在字符串 str 中第一个最长匹配的位置。如果匹配失败则返回0。

  • split(str, arr,regex) split 函数使用正则表达式 regex 分割字符串 str。分割后的所有结果存储在数组 arr 中。如果没有指定 regex 则 使用 FS 切分。

awk 'BEGIN {

str = "One,Two,Three,Four"

split(str, arr, ",")

print "Array contains following values"

for (i in arr) { print arr[i]

} }'

  • sprintf(format,expr-list) sprintf 函数按指定的格式( format )将参数列表 expr-list 构造成字符串然后返回。

awk 'BEGIN {

str = sprintf("%s", "Hello, World !!!")

print str }'

  • strtonum(str) strtonum 将字符串 str 转换为数值。如果字符串以 0 开始,则将其当作十进制数;如果字符串以 0x 或 0X 开 始,则将其当作十六进制数;否则,将其当作浮点数。

root@dev-node1:~# awk 'BEGIN {

> print "Decimal num = " strtonum("123")

> print "Octal num = " strtonum("0123")

> print "Hexadecimal num = " strtonum("0x123")

> }'

Decimal num = 123

Octal num = 83

Hexadecimal num = 291

  • sub(regex,sub,string)sub 函数执行一次子串替换。它将第一次出现的子串用 regex 替换。第三个参数是可选的,默认为 $0。

  • substr(str, start, l) substr 函数返回 str 字符串中从第 start 个字符开始长度为 l 的子串。如果没有指定 l 的值,返回 str 从第 start 个字符开始的后缀子串

root@dev-node1:~# awk 'BEGIN {

str = "Hello, World !!!"; subs = substr(str, 1, 5);

print "Substring = " subs }'

Substring = Hello

root@dev-node1:~# awk 'BEGIN {

str = "Hello, World !!!"; subs = substr(str, 1);

print "Substring = " subs }'

Substring = Hello, World !!!

  • tolower(str) 此函数将字符串 str 中所有大写字母转换为小写字母然后返回。注意,字符串 str 本身并不被改变。

  • toupper(str)此函数将字符串 str 中所有小写字母转换为大写字母然后返回。注意,字符串 str 本身不被改变。

时间函数

  • systime 此函数返回从 Epoch 以来到当前时间的秒数

  • mktime(dataspec) 此函数将字符串 dataspec 转换为与 systime 返回值相似的时间戳。dataspec 字符串的格式为 YYYY MM D D HH MM SS。

  • strftime([format [, timestamp[, utc-flag]]]) 函数根据 format 指定的格式将时间戳 timestamp 格式化

位操作函数

  • and 执行位与操作

  • compl 按位求补

  • lshift 左移位操作

awk 'BEGIN { num1 = 10

printf "lshift(%d) by 1 = %d\n", num1, lshift(num1, 1) }'

  • rshift 向右移位操作

  • or 按位或操作

  • xor 按位异或操作

其他函数

  • delete 被用于从数组中删除元素

  • exit 该函数终止脚本执行。它可以接受可选的参数 expr 传递 AWK 返回状态

  • flush 函数用于刷新打开文件或管道的缓冲区

  • getline 函数读入下一行

  • next 停止处理当前记录,并且进入到下一条记录的处理过程

awk '{if ($0 ~/Shyam/) next; print $0}' marks.txt

  • nextfile 停止处理当前文件,从下一个文件第一个记录开始处理

awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt

  • return 用于从用户自定义的函数中返回值。请注意,如果没有指定返回值,那么的返回值是未定义的

cat << EOF >> functions.awk

function addition(num1, num2) {

result = num1 + num2

return result }

BEGIN {

res = addition(10, 20) print "10 + 20 = " res

}

EOF

  • system 函数可以执行特定的命令然后返回其退出状态。返回值为 0 表示命令执行成功;非 0 表示命令执行失 败

awk 'BEGIN { ret = system("date"); print "Return value = " ret }'

输出重定向

  • 重定向操作符

awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'

  • 追加操作符

awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'

  • 管道 除了使用文件在程序之间传递数据之外,AWK 还提供使用管道将一个程序的输出传递给另一个程序。这种重定 向方式会打开一个管道,将对象的值通过管道传递给管道另一端的进程,然后管道另一端的进程执行命令

awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

  • 双向通信通道 AWK 允许使用 |& 与一个外部进程通信,并且可以双向通信。下面的例子中,我们仍然使用 tr 命令将字母转换为 大写字母

BEGIN {

cmd = "tr [a-z] [A-Z]"

print "hello, world !!!" |& cmd close(cmd, "to")

cmd |& getline out

print out;

close(cmd);

}

  • 第一条语句 cmd = "tr [a-z] [A-Z]" 在AWK 中建立了一个双向的通信通道。

  • 第二条语句 print 为 tr 命令提供输入。&| 表示双向通信。

  • 第三条语句 close(cmd, "to") 执行后关闭 to 进程。

  • 第四条语句 cmd |& getline out 使用 getline 函数将输出存储到 out 变量中。

  • 接下来的输出语句打印输出的内容,最后 close 函数关闭 cmd

车载以太网之权威指南_awk权威指南之 终结篇!相关推荐

  1. 【好书推荐】车载以太网权威指南

    20年后,会令你失望的不是做过的事,而是你没做过的,所以解开帆索,从安全的港湾出发,乘风而行,去探索.去梦想.去发现! Twenty years from now you will be more d ...

  2. 安全牛:“新一代SOC研究报告”之市场指南及技术指南点评

    在2017年8月9日,国内知名的企业级信息安全市场的专业新媒体--安全牛--发布了"新一代SOC研究报告"之市场指南及技术指南.在指南正式发布之前,7月份的阿里安全峰会(以后改成& ...

  3. 以太网迎新增长 专家眼中的车载以太网及AVB技术

    讨论车载以太网之前我们先来看看以太网的发展过程及现状,1963年"The Intergalactic Computer Network"的概念被认为是现代Internet的起源;1 ...

  4. 【自动驾驶】2.车载以太网 - SOME/IP简介

    车载以太网 - SOME/IP简介 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是车载以太网通信引入的一个概念,位于OSI 7层模型的 ...

  5. Linux调度系统全景指南(终结篇)

    点击上方蓝字关注公众号,更多经典内容等着你 | 导语本文主要是讲Linux的调度系统, 本篇是终结篇,主要讲当前多核系统调度策略和调度优化,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Li ...

  6. AUTOSAR从入门到精通100讲(四十七)-车载以太网 SOME/IP-SOME/IP的概念

    0. SOME/IP简介 SOME/IP (Scalable service-Oriented MiddlewarE over IP是一种车载以太网的通信协议,是BMW团队于2011年设计的,兼容AU ...

  7. python编程入门指南-编程入门指南

    编程入门指南 ----------------------------------------------- 编程入门指南 v1.5 --- https://zhuanlan.zhihu.com/p/ ...

  8. Multi-Gigabit MediaConverter车载以太网-万兆转换器

    继2010年率先发布世界第一款车载以太网百兆转换器,2017年发布世界第一款车载以太网千兆转换器之后,今天,Technica Engineering Gmbh率先发布了世界上第一款车载以太网万兆转换器 ...

  9. 车载以太网第二弹-实锤|SOME/IP概述及TC8 SOME/IP 测试实践

    什么是中间件(Middleware) 在了解SOME/IP之前,我们先要了解"中间件(Middleware)"技术.简单来说,中间件是存在于操作系统和用户软件之间的一些中间层软件. ...

最新文章

  1. IBM和Lightbend宣布构建新认知开发平台的战略
  2. winform把所有dll打包成一个exe
  3. Spring Cloud微服务实战(五)-应用通信
  4. 谈谈我对正向代理和反向代理的理解
  5. 树莓派3b能装java吗_树莓派3B-系统安装
  6. 利用 Commons-Fileupload 实现文件上传分析(转)
  7. oracle、mysql、sql server等;流行数据库的链接驱动配置
  8. 驾驭synchronize的方法
  9. python处理pdf实例_Python使用PDFMiner解析PDF代码实例
  10. 720视频2码率够吗_两个人去丽江5000够吗,2人去云南旅游5天多少钱(超详细篇)...
  11. canvas教程7-炫彩小球
  12. 大学计算机信息技术教程2020版知识点,大学计算机信息技术教程习题集.doc
  13. 动态规划之01背包问题
  14. UltraISO软碟通软件(绿色单文件版)
  15. JavaSE学习---I/O流学习分享
  16. MBA案例分析(行销与营销之行销三)
  17. 我的作品之《Unity虚拟现实开发实战》,翻译自《Unity Virtual Reality Projects》
  18. linux下c语言编程书籍6,Linux下C语言编程-6.pdf
  19. CDN是什么呢?CDN加速有什么优势?
  20. 电子设计(7)3.3V和5V串口通信电平转换电路(超详细,超简单)

热门文章

  1. java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
  2. (1)Adapter适配器(ArrayAdapter、SimpleAdapter、BaseAdapter)
  3. Vue插槽 slot
  4. time 和 datetime 模块
  5. 2022-2028年中国宠物用药行业市场前瞻与投资战略规划分析报告
  6. 2022-2028年中国民用航空装备行业市场需求与投资规划分析报告
  7. 2022-2028年中国三氟化氮行业市场调查研究及前瞻分析报告
  8. Go 学习笔记(43)— Go 标准库之 os/exec(执行外部命令、非阻塞等待、阻塞等待、命令输出)
  9. 分享一个小工具:Excel表高速转换成JSON字符串
  10. Linux 启动详解之init