grep 简单的文本搜索
sed 编辑文本
awk 生成格式化后的报告工具,而且对报告的内容做一些比较复杂的处理

awk [options] 'script' file1,file2,....

awk [options] 'PATTERN {action}'
awk 默认是以空格来分片的;$1表示第一段,$2表示第二段,.... $0 表示正行

-F: 指定字段分隔符

内置变量:
ORS: output record separator
OFS: output field separator 替换输出时的分隔符 awk -v OFS=: '{print $1,$2}' a.txt
FS: field separator 默认是空白字符
RS: record separator 默认是换行符
NR: the number of input records ,awk 命令所处理的记录数,如果有多个文件,这个数目会把处理的多个文件中行统一计数;
NF: number of field ,当前记录的field 个数
FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;
ARGV:数组,保存命令行本身这个字符串,eg: awk '{print $0}' test2.txt test2.txt 命令中,ARGV[0]保存awk ,ARGV[1]保存test1.txt;
ARGC awk 命令的参数的个数

print 与printf

print item1,item2,.....
各项目之间使用逗号隔开,而输出时则以空白字符分隔;
输出的item可以为字符串或数值、当前记录的字段(eg:$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
print 命令后的item 可以省略,此时其功能相当于 print $0,因此如果想输出空白行,则需要使用print "";

printf format,item1,item2,....

其于print 命令的最大不同是,printf 需要指定format;
format 用于指定后面的每个item的输出格式;
printf 语句不会自动打印换行符。\n

format 格式的指示符都以%开头,后跟一个字符,如下:
%c:显示字符的ASCII码;
%d,%i:十进制整数
%e,%E :科学计数法显示数值;
%f :显示浮点数;
%g,%G:以科学计数法的格式或浮点数的格式显示数值;
%s:显示字符串
%u:无符号整数;
%%:显示%自身;

修饰符:
N:显示宽度;
-:左对齐;
+:显示数值符号;

eg: awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd
输出重定向

特殊文件描述符
/dev/stdin : 标准输入
/dev/sdtout: 标准输出
/dev/stderr:错误输出
/dev/fd/N :某特定文件描述符,如/dev/stdin 就相当于 /dev/fd/0
eg: awk -F: '{printf "%-15s %i\n", $1,$3 > "/dev/stderr"}' /etc/passwd

awk 中,任何非0值或非空字符串都为真,反之就为假

举例:

eg:
awk -F: '$3>=500{print $1,$3}' /etc/passwd
awk -F: '/bash/{print $0}' /etc/passwd
awk -F: '{if ($3==0) print $1,"Admin"; else print $1,"Common User."}' /etc/passwd