awk: 又称gawk,以Aho Kernighan Weinberger 3位作者首字母命名的UNIX平台上的强大编辑工具.其原理(处理文件时)是依次(循环遍历一遍)读取文件的每行,一次读取一行,按照分隔符(如果文件是有固定格式的)进行切片或其它处理工作.
用法格式: awk [Options] 'Patterns{Actions Statements}' File1 File2 ...
,各段说明如下:
Options:awk命令的选项
-F: 指定对每行处理的分隔符.然后就可以用($0,$1,$2,...)依次取出各列,其中$0指代整行内容.
-v varname: *声明自定义变量 *
示例-->awk -v word="Hello awk!" 'BEGIN{print word}'
Patterns: 匹配模式
BEGIN/END: 特殊模式,仅在awk命令执行前或执行后运行一次.
expression: 表达式,其值非0或为非空字符时满足条件,如$1~/foo/ 或 $1=="ShenZhen"
示例-->awk -F: '$3==0,$7~"nologin"BEGIN{print "username:%10s,userid:%5s,usershell:%20s",$1,$3,$7}' /etc/passwd
/RegularExpression/: 正则表达式
示例-->awk -F: '/^/{print $1,$3}' /etc/passwd
Actions: 处理动作
1.print --> '{print $1, $4}'
2.printf:格式化输出,用法类似C语言里的printf,需要结合各格式化字符才能更加美观地显示输出(不会自动换行)
format格式符 | 作用 |
---|---|
%c | 显示字符的ASCII码 |
%d, %i | 十进制 |
%e, %E | 科学计数法显示数值 |
%f | 显示浮点数 |
%g, %G | 以科学计数法的格式或浮点数的格式显示数值. |
%s | 显示字符串 |
%u | 无符号整数 |
%% | 显示%自身 |
修饰符 | ----- |
N | 显示宽度 |
- | 左对齐 |
+ | 显示数值符号 |
示例--> awk -F: '{printf "%-15s %i\n", $1, $3}' /etc/passwd
Statements: 脚本语句
if (condition) statement [ else statement ]
示例--> awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd
while (condition) statement:对每行内容进行循环处理
示例-->awk -F: '{i=1;while(i<=3){print $i;i++}}' /etc/passwd
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
示例-->awk -F: '$NF !~ /^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n", A,BASh[A]}}' /etc/passwd
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}
awk内置变量:
变量名 | 含义 |
---|---|
FS | Field Separator,(输入)文本文件时所使用的字段分隔符 默认是空白字符 |
OFS | Output Field Separator,输出分隔符,可以自定义各种.示例--> awk 'BEGIN{OFS="++"}{print $1,$2,$3}' test.txt |
RS | Record Separator,(输入)文本信息所使用换行符 |
ORS | Output Record Separator,输出的换行符 |
NR | Num of Record,行数 |
FNR | 用于记录正处理的行是当前这一文件中被总共处理的行数,而NR记录的行数是所有处理的文件的 总数. |
NF | Num of Field,当前正在处理的行的列数.示例: awk '{print NF}' a.py # a.py这个文件的各列的列数不确定,所以输出的数字是不一样的. |
FILENAME | 当前处理的文件文件名. |
awk的操作符(与其它语言如Python shell等非常类似):
-x: 负值
+x: 转换为数值
x^y: 与运算
x**y: x的y次方
x[+|-|*|/]y: 加减乘除法
= += -= ...
++ --
x<y x>y x<=y x!=y x==y x~y(x能被y模式所匹配) x!~y
x&&y x||y
selector?if-true-exp:if-false-exp
awk函数: function_name(para1, para2)