awk - 简介 Linux 制表好工具

awk

Linux文字处理工具中, 有另一个杀器awk
但awk是个程序语言, 所以它很灵活且功能强大.
awk可以帮助我们统计,可以制作表格等等的格式化以後, 做显示, 算是个报告生成器

## awk处理方式

  • 一次处理一行内容, 跟下一节的sed一样都是行处理工具
  • awk对每行可以进行切片处理, 对单字做切片
// 输出第一个单字
awk '{print $1}' 

awk统一格式

// 命令行格式
awk [options] 'command' file(s)
// awk程序区块格式
awk -f awk-script-file file(s)
// 管道格式
stdout | awk [options] 'command'
stdout | awk -f awk-script-file

命令行格式

awk [options] 'command' file(s)
这里command也有自己的格式pattern {awk操作命令}
pattern这里可以是Regex也可以是逻辑判断式, 是不是很强大?

awk工作流程

https://ithelp.ithome.com.tw/upload/images/20210912/20104930G5Y4p3u6bf.png

awk操作命令

  • 内置函数
    • print()
    • printf()
    • getline
  • 控制命令
    • if() {...} else {...}
    • while() {...};

awk 内置变数

  • $0 表示当前行
  • $1 表示第1个字段/单字
  • $2 表示第2个字段/单字; 依此类推

options

  • -F : field-separator分割符号, 预设是空格
awk -F ':' '{print $1}' /etc/passwd

把/etc/passwd给输出出来, 如下图
https://ithelp.ithome.com.tw/upload/images/20210909/201049305UD8meglbz.png
透过awk取得用户名称, 用户名称依照:做分割的话, 会是第一个字段
https://ithelp.ithome.com.tw/upload/images/20210909/20104930CMo6hQS1XJ.png

透过awk把第1个字段和第3个字段UID一起输出, 透过,在变数之间多个空格, 是awk预设的分隔符号.
如果是这样打'{print $1 $3}', 对awk来说是把字串做拼接, 并不会把字串做分隔.
又或是透过" "把空格视为字串一起输出; 也能透过这种方式, 补充些说明文字

awk -F ':' '{print $1,$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210909/20104930bRSoRSTYVU.png

awk -F ':' '{print "User:"$1" ""UID:"$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210909/20104930EQfq0Aqb3E.png

  • NR 行号
  • NF 字段数量
  • FILENAME 处理的文件名
// 输出行号与每行的字段总数量
awk -F ':' '{print NR,NF}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/201049308hCJPypC9V.png

透过刚刚学的, 将/etc/passwd中的用户名称, 行号跟字段数量给输出

awk -F ':' '{print "Ln:"NR,"WordCnt:"NF,"User:"$1}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/201049307KK4l1nFSB.png

也能透过printf做格式化字串

awk -F ':' '{printf "Ln:%2s WordCnt:%s User:%s\n", NR,NF,$1}' /etc/passwd
// 需要加上\n, 替每一行的输出做换行

https://ithelp.ithome.com.tw/upload/images/20210910/20104930wzCyTtKLWK.png

只输出UID > 10的行号、用户名

awk -F ':' '{if ($3>100) printf "Ln:%2s User:%s\n", NR, $1}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/20104930sDi1iWm1qV.png

找出/var/log/syslog中发生Error的日期时间
可以透过之前的grep来查找後, 在用awk只输出日期时间

grep "Error" syslog | awk '{print $1, $2, $3}'

也能在awk中使用Regex

awk '/Error/{print $1,$2,$3}' syslog 

https://ithelp.ithome.com.tw/upload/images/20210910/201049309zzJaJWiks.png

本日小结

awk关键字不多, 可以在整理输出时, 用一些控制命列+逻辑运算做些过滤, 而後将结果整齐的输出
是个简单的语言也是个强大的工具


<<:  Ruby on Rails CRUD 之 D(Delete)

>>:  Day 5:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《爱x死x机器人》之〈自动客服〉

Day 23 实时时钟(real-time)与系统时钟(system clock)

嵌入式系统,会因为时间关系,系统和用户的任务经常要定期的重新设定排程。所以对於某个特定时间就需要透过...

[Day10] Vite 出小蜜蜂~Function Composition!

Day10 接下来,要帮 Squid 也装上 Laser, 敌人的 Laser 跟我们的外观是不一样...

[ Day 9 ] - 函式

函式 一个函式内会包装一段执行的动作,可以被重复的使用 如何宣告函式 宣告函式时,需要使用 func...

Day19 用python写UI-聊聊OptionMenu

OptionMenu就是下拉式选单的概念,可以有不同的设定方法,可以设成有预设选项的,也可以获得选好...

误用/滥用测试(Misuse/Abuse testing)

-HTTP请求(来源:Chua Hock-Chuan) 测试人员在HTTP请求中操纵URL的查询字...