grep:文本过滤器
grep ‘pattern’ input_file …
sed:流编辑器
sed ‘COMMAND/PATTERN/[修饰符]’
awk:作者名字首字母的组合,报告生成器,抽取特定信息并格式化输出
awk [options] ‘PATTERN {action}’ file1, file2 …
-F: 以冒号为分隔符;
awk的输出:
一、print
print的使用格式
print item1, item2,…
要点:
1、各项目之间使用逗号隔开,而输出时则以空白字符分隔;
2、输出的item可以为字符串或者数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后在输出;
3、print命令后的item可以省略,此时功能相当于print $0,因此,如果想输出空白行需要使用print “”;
例子:
awk ‘BEGIN { print “line one\nline two\nline three”}’
awk -F: ‘{print $1, $3}’/etc/passwd
二、awk变量
2.1、awk内置变量之记录变量
FS:filed separator,读取文本时所使用的字段分隔符
RS:record separator,读取文本时所使用的换行符
OFS:output Filed separator;
ORS:output Row Separator;
2.2、awk内置变量之数据变量
NR:the number of input records, awk命令所处理的记录数,如果有多个文件,这个数目会基于所有已处理文件的;
NF:number of filed,当前记录的filed个数;
FNR:与NR不同的是,FNR用于记录行是基于当前处理文件的
ARGV:数组,保存命令行本身这个字符串,如awk ‘{print $0}’ a.txt b.txt这个命令中,ARGV[0]保存awk, ARGV[1]保存a.txt
ARGC:awk命令的参数的个数
FILENAME:awk命令所处理的文件的名称
ENVIRON:当前shell环境变量及其值得关联数组
如 awk ‘BEGIN {print ENVIRON[“PATH”]}’
2.3、用户自定义变量
gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母数字下划线,且不能以数字开头,
gawk变量名称区分字符大小写。
2.3.1在脚本中赋值变量
在gawk中给变量赋值使用赋值语句进行,如awk ‘BEGIN{ var = “variable testing”; print var}’//语句之间用分号隔开
2.3.2在命令行中使用赋值变量
gawk命令中也可以在“脚本”外给变量赋值,并在脚本中进行引用,如 awk -v var=“variable testing” ‘BEGIN {print var}’
三、printf
printf命令的使用格式:
printf format, item1, item2,…
要点:
1、其与print命令的最大的不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行符
format格式的指示符都以%开头,后跟一个字符,如下:
%c:显示字符的ASCII码;
%d,%i:十进制整数;
%e,%E:科学计数法显示数值;
%f:显示浮点数;
%g,%G:以科学计数法的格式或浮点数的格式显示数值;
%s:显示字符串;
%u:无符号整数;
修饰符:
N:显示宽度;
-:左对齐;
+:显示数值符号;
四、输出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin:标准输入
/dev/stdout:标准输出
/dev/stderr:错误输出
/dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;
五、awk的操作符:
-x:负值;
+x:转换为数值;
x^y:
x**y:次方
x/y:除法
x+y:
x-y:
x%y:
字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接;
负值操作符:
=
+=
-=
*=
/=
%=
^=
**=
++
—
需要注意的是,如果某模式为=,此时使用/=/可能会有语法错误,应以/[=]/替代;
布尔值
awk中,任何非0值或者非空字符串都为真,反之就为假;
比较操作符:
x < y
x <= y
x > y
x >= y
x == y
x != y
x ~ y true if the string x matches the regexp denoted by y
x !~ y
subscript in array true if the array array has an element with the subscript subjscript.
表达式之间的逻辑关系运算符
&&
||
条件表达式
selector? if-true-exp:if-false-exp
函数调用:
function_name (para1, para2)
六、awk的模式
awk ‘program’ input-file1, input-file2 …
其中的program 为
pattern { action}
pattern {action}
……
6.1、常见的模式类型:
1、regexp:正则表达式,格式为/regexp/
2、expression:表达式,其值非0或者非空字符串时满足条件, 如: $1 ~/foo/ 或 $1 == “hello”,用匹配运算符~或者不匹配运算符!~
3、ranges:指定的匹配返回,格式为pat1,pat2
4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或者结束前运行一次
5、empty(空模式):{之前未指明任何模式,匹配任意输入行;
6.2、常见的{action}:
1、{expression}:
2、{control statements}:
3、{compound statements}:
4、{input statements}:
5、{output statements}:
/正则表达式/:使用通配符的拓展集
关系表达式:可以用下面运算表中的关系运算符进行操作,可以是字符串或者数字的比较,如$2>$1选择第二个字段比第一个字段长的行
模式匹配表达式:
模式,模式:指定一个行的范围,该语法不能包括BEGIN和END模式
BEGIN:让用户指定在第一条记录被处理之前所发生的动作,通常可以在这里设置全局变量
END:让用户在最后一条输入进记录被读取之后发生的动作。
七、控制语句
7.1、if-else
语法:if (condition){then-body} else {[else-body]};
awk -F: ‘{if ($1 == “root”) print $1, “admin”;else print $1, “common user”}’ /etc/passwd
7.2、while:循环的是字段而不是行
语法:while (condition){statement1; statement2;…}
awk -F: ‘{i = 1; while(i <= 3) {print $i; i++}}’ /etc/passwd
7.3、do-while
语法:do{statement1,statement2, …} while(condition)
awk -F: ‘{i = 1; do {print $i; i++} while(i <= 3)}’ /etc/passwd
7.4、for
语法:for(variable assignment; condition; iteration process){statement1, statement2,…}
awk -F: ‘{for(i = 1; i <= 3; i++) print $i}’ /etc/passwd
for循环还可以用来遍历数组元素
语法:for (i in array){statement1、 statement2, …}
awk -F: ‘$NF!~/^$/{BASH[$NF]++} END{for A in BASH){printf “%15s:%i\n”, A, BASH[A]}}’ /etc/passwd
7.5 case
语法:switch(expression) {case VALUE or /REGeXP/: statement1, statement2, … default: statement1, …}
7.6 break和continue
常用于循环或者case语句中
7.7next(相当于awk内部的continue)
提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:
awk -F: ‘{if ($3%2 == 0) next; print $1, $3}’/etc/passwd
八、awk中使用的数组
8.1数组:注意,下标从1开始计数!可以直接使用不用事先声明。
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数组元素事先不存在,那么在引用的时候,awk会自动创建此元素并初始化为空串;因此,要判断某数组中是否存在某元素,需要使用index in array的方式
要遍历数组中的每一个元素,需要使用如下的特殊结构:for (var in array){statement1, statement2,…},其中var用于引用数组下表,而不是元素值;
如:
netstat -ant | awk ‘/^tcp/ {++S[$NF]} END { for(a in S) print a, S[a]}’
8.2删除数组变量
从关系数组中删除数组索引需要使用delete命令,使用格式为:
delete array[index]