-
grep
:用于过滤文本; -
sed
:流编辑器; -
awk
是一个报告生成器,用于将信息进行格式化之后,然后进行显示,通常使用的是
-
awk
的基本处理机制:awk
每一次读取其中的一行文本,然后按照分隔符进行切片,在awk
内部按照每一个变量来引用分隔符分开的各个字段,使用$0
:表示该行文本的内容,$1-->$n
用于表示之后的每一段文字的切片,在指定输出格式时awk '{print $1,$2}' a.text
,但是在输出时,使用的是默认的分隔符;指定分隔符使用的是-F
选项;
-
print
的使用格式: -
注意:
- 1.各个项目之间使用
,
进行分割,而输出默认是空白字符; - 2.输出的
item
可以为字符串或者数值,当前记录的字段$1--->$n
,变量或者awk
的表达式,对于数值会转换成为字符串然后进行输出; - 3.
print
命令后面的item
可以省略,相当于print $0
,想要输出空白行,则需要使用print " "
;
- 1.各个项目之间使用
-
内置变量
-
记录变量:
-
FS: filed separator
:表示输入分隔符号,默认是空白字符,可以通过-F
指定,也可以通过FS
变量进行指定,通常表示的是按照行读取每一行文本时,使用的字段分隔符号;
-
RS
:表示的含义输入文本时,使用的分隔符号,也就是行结束符号; -
OFS
:用于指定输出字段分隔符号; -
ORS
:用于指定的是输出行字段分隔符号; -
数据变量:
-
NR
:用于表示awk
命令所处理的记录数,如果有多个文件,这个数目会将会把多个文件的行统一计数;
-
FNR
:同样是用于计数,但是对于多个文件是分开计数的.用于记录当前文件被处理的行数;
-
NF
:记录当前filed
的个数;
-
ARGV
:是一个数组,用于保存命令本身这个字符串,例如awk '{print $0}' a.txt b.txt
,其中ARGV[0]
保存的就是awk
,ARGV[1]
保存的就是'{print $0}'
; -
ARGC
:表示awk
命令执行参数的个数; -
FILENAME
:当前shell
环境变量以及其值的关联数组; -
用户自定义变量:
-
gawk
允许用户自定义变量,变量的命名规则:只能够使用数字字母和下划线,但是不能够使用数字开头,并且严格区分大小写; -
用户自定义变量的两种方式:
-
printf的使用
-
1.和
print
的不同在于printf
需要指定format
; -
2.
format
用于指定后面的每个item
的输出格式; -
3.
printf
语句不会自动打印换行符号; -
format
的格式都是使用%
开头,后面跟一个字符,如下:%c
:显示字符的ASCII
码;%d.%i
:用于显示字符的十进制数;%e %E
:使用科学计数法显示数值;%f
:显示浮点数;%g %G
:使用科学计数法的格式或者浮点数的格式显示数值;%s
:显示字符串;%u
:无符号整数;%%
:显示%
本身;
-
使用的几个修饰符:
N
:显示宽度;-
:左对齐;+
:显示数值符号;
-
重定向操作
-
特殊文件描述符号:
/dev/stdin
:标准输入;/dev/stdout
:标准输出;/dev/stderr
:错误输出;/dev/fn/n
:某个特定的文件描述符号;
-
使用上面的方式来支持重定向操作
-
支持算术表达式
-
-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
的要求; -
x!~y
:表示x
不符合于正则表达式Y
的要求; -
表达式之间的逻辑关系运算符号
-
&&
:表示与关系; -
||
:表示或关系; -
条件表达式
-
selector?of-true-exp:if-false-exp
-
函数调用
-
function_name(para1,para2)
-
awk的模式
-
Regexp
:正则表达式,格式为/regular expression/
;
-
expression
:支持表达式,其值为非0
或者为非空字符时满足条件,如:$1 ~ /foo/
或者使用$1 == "lixxun"
;
-
显示用户的
shell
类型为bash
的
-
range
指定模式进行匹配,格式为pat1, pat2
-
BEGIN/END
:表示特殊模式,仅在awk
命令执行前运行一次或者结束前运行一次;
-
常见的action
-
expression
:赋值表达式,判断表达式; -
Control statement
:控制语句; -
控制语句:
-
if-else
:
if (condition) {then-body} else {[else-body]}
- 例如
awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd;
- 或者:
- 统计系统上面存在多少个
UID>500
的用户
while
语句:
while (condition){statement1;statement2;...}
- 例如判断每一行中的每一字段的长度是否大于
4
do-while
循环:do {statement1,statement2,....} while (conditaion)
for
循环是用来遍历数组的
for (variable assignment; condition;iteration process) {statement1,statement2,...}
- 支持
case
语句
switch (expression) {case VALUE or /REGEXP/:statement1,statement2,...default:statement1,...}
break
和continue
:- 用于结束寻循环和
case
语句,通常处理的字段; next
- 提前结束对于本行文本的处理,并接着处理下一行;例如:显示
ID
号为奇数的用户;
- awk中的数组
array[index-expression]
:index-expression
可以使用任意字符串,需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk
会自动创建此元素并初始化为空串,因此,要判断某数据组中是否存在某些元素,需要使用index in array
的方式;- 如果需要遍历数组中的每一个元素,需要按照下面的方式
for (var in array) {statement1,statement2,...}
- 其中
var
用于引用数组下标,而不是数组元素; - 例子:
- 例如
- 统计
TCP
连接的状态
- 统计某日志文件中,
IP
地址的访问量
awk '{counts[$1]++}END{for(ip in counts) printf"%-20s:%d\n",ip,counts[ip]}}'
- 可以用于统计某个日志文件
IP
出现的次数;