awk 文本处理
awk是Linux/Unix下强大的文本处理工具,1977年诞生于AT&T贝尔实验室。发展至今,现在最常用的实现是gawk。
awk用法简介
我们知道,sed以行为单位处理文件, awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk默认的行分隔符是换行符,默认的列分隔符是连续的空格或Tab制表符,行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,此时就可以重新定义awk的列分隔符为:并以列为单位处理这个文件。
awk实际上是一门很复杂的脚本语言,还有像C语言一样的分支和循环结构,但是基本用法和sed类似,awk命令行的基本形式为:
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...
注意:具体的命令脚本必须使用单引号。
和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions}
- 和
sed类似,pattern是正则表达式,actions是一系列操作。 awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。
自动变量$1、$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。
awk '{print $2;}' testfile
awk也有和C语言非常相似的printf函数。
awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
awk命令的condition部分还可以是两个特殊的关键字:BEGIN和END,对于每个待处理文件,BEGIN后面的actions在处理整个文件之前执行一次,END后面的actions在整个文件处理完之后执行一次。
awk命令可以像C语言一样使用变量(但不需要定义变量),比如统计一个文件中的空行数:
awk '/^ *$/ {x=x+1;} END {print x;}' testfile
```
## 常用内建变量

下面例子中,我们打印系统中的帐号列表:
```bash
awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。