(P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1.什么是awk
- 2.awk简单用法
- 3.awk脚本语法
- 4.awk执行过程
1.什么是awk
- awk 是什么
awk 是一种用于处理数据和生成报告的编程语言
awk 可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题
awk 与 grep、sed 结合使用,将使 shell 编程更加容易
Linux 下使用的 awk 是 gawk - awk 如何工作
awk 逐行扫描输入 ( 可以是文件或管道等 ),按给定的模式查找出匹配的行,然后对这些行执行 awk 命令指定的操作。 - 与 sed 一样,awk 可以使用重定向将 awk 的输出保存到文件中。
2.awk简单用法
awk -F: '{ print $1 }' /etc/passwd
$1表示第1列,$0表示整行
awk -F: '{ print $1, $3 }' /etc/passwd
awk -F: '{ print $1 "|" $3 }' /etc/passwd
输出的话,按照|进行分割
awk -F: '/root/{ print $1 "|" $3 }' /etc/passwd
awk -F: '/^root/' /etc/passwd
3.awk脚本语法
- awk 命令的一般形式:
其中 BEGIN {actions} 和 END {actions} 是可选的
awk_script 可以由一条或多条 awk_cmd 组成,每条 awk_cmd 各占一行;
每个 awk_cmd 由两部分组成:/pattern/{actions};
awk_cmd 中的 /pattern/ 和 {actions} 可以省略,但不能同时省略;/pattern/ 省略时表示对所有的输入行执行指定的 actions;{actions} 省略时表示打印整行;
4.awk执行过程
① 如果存在 BEGIN ,awk 首先执行它指定的 actions
② awk 从输入中读取一行,称为一条输入记录
③ awk 将读入的记录分割成数个字段,并将第一个字段放入变量 $1 中,第二个放入变量 $2 中,以此类推;$0 表示整条记录;字段分隔符可以通过选项 -F 指定,否则使用缺省的分隔符。
④ 把当前输入记录依次与每一个 awk_cmd 中 pattern 比较:如果相匹配,就执行对应的 actions; 如果不匹配,就跳过对应的 actions,直到完成所有的 awk_cmd
⑤ 当一条输入记录处理完毕后,awk 读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。
⑥ awk 处理完所有的输入后,若存在 END,执行相应的 actions
⑦ 如果输入是文件列表,awk 将按顺序处理列表中的每个文件。
获取ip
ifconfig | awk '/inet addr/{ print $2 }' | awk -F: '{ print $2 }'
ifconfig | awk '/inet addr/{ print $2 }' | awk -F: 'BEGIN { print "begin..."} { print $2 } END { print "end..."} '
- 模式匹配
① 使用正则表达式:/rexp/,如 /^A/、/A[0-9]*/
awk 中正则表达式中常用到的元字符有:
② 使用布尔 ( 比较 ) 表达式,表达式的值为真时执行相应的操作 (actions)
(1)表达式中可以使用变量 ( 如字段变量 $1,$2 等 ) 和 /rexp/
(2)表达式中的运算符有
关系运算符: < > <= >= == !=
匹配运算符: ~ !~
x ~ /rexp/ 如果 x 匹配 /rexp/,则返回真;
x!~ /rexp/ 如果 x 不匹配 /rexp/,则返回真。
eg:
awk '$1 > 20 {print $0}' test.in
awk '$2 ~ /^6/ {print $0}' test.in
$2表示第2列的第1个字符
(3) 复合表达式:&& ( 逻辑与 )、|| ( 逻辑或 )、! ( 逻辑非 )
expr1 && expr2 两个表达式的值都为真时,返回真
expr1 || expr2 两个表达式中有一个的值为真时,返回真
!expr 表达式的值为假时,返回真
eg:
awk '($1<20)&&($2~/^6/){print $0}' test.in
awk '($1<20)||($2~/^6/){print $0}' test.in
awk '!($2~/^6/){print $0}' test.in
awk '/^#/ && /#$/{ print $0 }' test.in
行首和行尾都是#号
注:表达式中有比较运算时,一般用圆括号括起来
awk –F: '{print $1}' test.in
awk -F'[ :]' '{print $1}' test.in
awk 中的字段分隔符可以用 -F 选项指定,缺省是空格。
(2)重定向与管道
awk '{print $1, $2 > "output"}' test.in
awk 'BEGIN{"cal" | getline a; print a}‘
Getline表示获取第一行到a
- 更多awk
awk不仅是一个命令,它更是一个编程语言
(1)变量
内部变量:
awk ' {print NR,$0} ' #给文件加上行号
NR是内部变量,表示给文件加上行号
自定变量:知道即可
(2)函数
内置函数
自定义函数
awk '{ print sum($1,$2) } function sum(x,y) { s=x+y ; return s }' grade.txt
(3)数组
awk 'BEGIN { print split("123#456",arr,"#") ; for (i in arr) { print arr[i] } }‘
split内置函数表示:按照#分割,分割的函数放在arr数组中