D.H.Q的烂笔头

Just code for fun~

linux命令学习 -- awk

awk 是一个功能强大的文本处理工具,常用于数据结构分析和数据格式化输出。不过它更多像是一种解析型编程语言,因为它有自己的变量、条件表达式、循环,以及算术运算和字符操作,你可以用它的语法规则来写一些对数据进行复杂操作的 awk 脚本。它的命名来自于它的三位创始人姓氏的首个字母:Alfred AhoPeter WeinbergerBrian Kernighan

awk 的用法格式

awk '/查询表达式/ {操作指令}' 文件
  • 查询表达式是一个正则表达式
  • 操作命令 - 符合 awk 语法规则的表达式
  • 文件 - 被操作的文件(也可以是标准数据输出)
  • 用单引号括着的 awk 操作表达式是为了避免 shell 的一些特殊字符不被解释分析

单引号括着的 awk 操作表达式允许同时存在几个查询表达式和操作指令,例如:

awk '/查询表达式1/ {操作指令1} /查询表达式2/ {操作指令2} file

awk 的工作方法

  • awk 被操作文件里的数据是一行一行被读取
  • 对于每一行,都会按顺序匹配给出的查询表达式,如果匹配,则执行相应的操作指令
  • 如果没有匹配,则不会执行操作指令
  • 上面的表达式,查询表达式和执行指令都是可选的,不一定全部都要
  • 如果查询表达式没有给出,那么 awk 将会对文件的每一行执行操作指令处理
  • 如果操作指令没有给出,将会输出跟给出的查询表达式匹配的所有行
  • 如果是个空的花括号,没有给出任何操作指令,那么将会执行默认的打印操作
  • 操作指令里的每条操作语句应该用分号间隔

假如有一个 ls.txt 文件,内容如下:

drwxr-xr-x    3 user  group    102  1  9 20:02 bin
-rw-r--r--    1 user  group    918  1  9 20:02 build.cmd
drwxr-xr-x   13 user  group    442  1  9 20:02 deps
drwxr-xr-x   16 user  group    544  1  9 20:02 doc
drwxr-xr-x  561 user  group  19074  3 31 10:06 ebin
drwxr-xr-x   10 user  group    340  1  9 20:02 include
drwxr-xr-x   47 user  group   1598  1  9 20:02 modules
drwxr-xr-x   16 user  group    544  1 15 15:35 priv
drwxr-xr-x   19 user  group    646  1  9 20:02 src
-rwxr-xr-x    1 user  group    287  1  9 20:02 start.sh

打印第3、第5字段

awk '{print $3,$5}' ./ls.txt 

把含有 bin 或者 doc 字符的数据打印出来

awk '/bin|doc/ {print $0}' ./ls.txt 

上面的也可以写成:

awk '/bin/ {print $0} /doc/ {print $0}' ./ls.txt

获取第6字段大于1的数据

awk '$6 > 1' ./ls.txt

把第2段的所有值的总和打印出来

awk 'BEGIN { print "count the number:" } ; { x += $2 } ; END { print "total is : " x }' ./ls.txt

一些常用的 shell 脚本

结合之前介绍的 sed 命令,算出能被 99 整除的 5 位数 - 123**

awk 'BEGIN {for(i=0;i<100;i++){print (12300+i)/99}}' | sed '/\./d' | awk '{print $1 * 99}'

利用 grepcut 命令,用 shell 脚本获取本机 IP 地址

ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}'
#或者
#hostname -i

统计最近经常使用的 10 条 linux 命令

history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
comments powered by Disqus
返回顶部