awk命令
格式:awk [option] ‘program’ file (命令,选项,命令主体,文件)
命令主体部分:[/模式/]{动作} (命令主体部分应该用单引号引起来)
模式部分可有可无:是用来决定何时触发awk,以及怎么触发
动作部分:决定怎么处理数据,需要将动作放到"{ }"中
选项部分:
-f,--file program-file:从指定的文件中加载program语句块,而不是通过命令行给出相关的程序内容;
-F,--field-separator fs:指定字段的输入分隔符;默认是空白字符;
-v,--assign var=val:用于声明自定义变量并为变量赋值;
awk中的一些概念:
a.分隔符:
输入分隔符:awk处理数据时,会根据特定的标识符号把数据分段,这种标识符就是输入分隔符,默认为空白符
输出分隔符:将数据处理完成后,会用分隔符将这些分段的数据连接起来,这样的分隔符叫输出分隔符;默认也为空白符;
b.记录
awk处理数据时,用换行符分开的每一行就是一个记录,通常用$0表示
c.字段
awk用分隔符将一个记录分成若干个字段,字段分别用$1,$2,$3,....$NF表示($NF用来表示最后一个字段)
3.awk的工作原理:
1.awk首先会执行BEGIN{动作。。。}语块中的语句
2.awk然后会执行/模式/{动作。。。}语块内的语句
3.awk最后会执行END{动作。。。}语块内的语句
注意:
1) BEGIN语句块在awk开始处理数据内容之前就被执行;通常用于生成表头;此语句块是可选语句块;
2) END语句块在处理完所有的数据之后,才会被执行;通常用于数据汇总;此语句块是可选语句块;
3)/模式/ {动作}语句块特别重要,其模式语句块不能省略,但是其动作语句可以省略,若省略默认执行print命令
4.awk的用法
内建变量:(awk自己定义的变量,每个变量都有其不同的功能)
FS:输入字段分隔符,默认空白符
[root@bogon html]# awk -v FS=: ‘{print $1,$2}‘ /etc/passwd
root x
`使用 : 作为分隔符并且输出第一第二字段,注意变量必须使用 -v 声明
OFS:输出字段分隔符,默认空白符
[root@bogon html]# awk -v FS=: -v OFS="--" ‘{print $1,$2}‘ /etc/passwd
root--x
```修改输出分隔符
RS:输入换行符,用来分隔记录的
[root@bogon html]# awk -v RS="/" ‘{print $0}‘ /etc/passwd
root:x:0:0:root:
root:
bin
bash
ORS:输出换行符,用来决定记录如何输出
[root@bogon html]# awk -v ORS="------" ‘{print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash------bin
NF:每一行字段的总数
root@bogon html]# awk -F : ‘{print NF}‘ /etc/passwd
7
//显示一行内字段的总数
[root@bogon html]# awk -F : ‘{print $NF}‘ /etc/passwd
/bin/bash
//显示最后一个字段
NR:行的总数,可以看做每一行的行号
[root@bogon html]# awk -F : ‘{print NR}‘ /etc/passwd
1
2
3
//显示各行的行号
[root@bogon html]# awk -F : ‘{print $NR}‘ /etc/passwd
root //第一行的第一个记录
x //第二行的第二个记录
2
4
lp
/sbin
/sbin/shutdown //第七行的第七个记录
//可以看出NR是根据行变化而变化的
FNR:可以处理多个文件,并分别显示他们的行
FILENAME:正在被处理的文件的文件名字
[root@bogon html]# awk ‘{print FILENAME}‘ /etc/passwd
/etc/passwd
/etc/passwd
//因为awk是一行一行的处理文本的,所以为了避免重复,我们可以使用END{动作}来总结
ARGC:命令行内参数的数量
[root@bogon html]# awk ‘END{print ARGC}‘ /etc/passwd
2
//包括awk命令本身,但不包括awk命令的选项部分和program部分 所以为2
ARGV:由命令行参数构成的数组
[root@bogon html]# awk ‘END{print ARGV[1]}‘ /etc/passwd
/etc/passwd
[root@bogon html]# awk ‘END{print ARGV[0]}‘ /etc/passwd
awk
4.自定义变量
定义方式 -v 名字=值
示例
[root@bogon html]# awk -v var=www -F : ‘{print $1,var}‘ /etc/passwd
root www
//注意:在引用变量时不需要添加$符号,否则引用的是$0
4.常见的动作
print:以标准的格式输出 ‘’{print itm1,itm2}‘’
注意:各item之间用逗号隔开
item可以是数字,字符串,变量,字段,还可以是awk的表达式
默认的item是$0
若各item用空格隔开或没隔开,则输出的结果将不会有输出分隔符
printf:格式化输出 ‘{printf "格式" item1,item2...}‘
注意:printf的格式没有自动换行,所以需要在格式末尾添加\n
printf必须给出格式
"格式"需要为后面的每一个item单独指定一个格式化符号,若不指定则不会输出未指定的那一列
格式与item也需要使用逗号隔开
常见的格式:
%c:以ASCII码表中的内容显示字符信息;
%d, %i:显示十进制整数;
%e, %E:以科学计数法来显示数字;浮点类型;
%f, %F:显示十进制数字的浮点形式;
%g, %G:以科学计数法显示浮点数字;
%u:显示无符号十进制数;
%s:显示字符串;
%x, %X:显示无符号的十六进制整数;
%%:显示%;
#[.#]:第一个数字用来控制显示宽度;第二个数字表示小数点的精度;
如:%5s, $8.3f
-:表示采用左对齐方式显示;默认是右对齐;
+:显示数字的正负符号;
[root@bogon html]# awk -F: ‘{printf "%20s : %3s :%-+10s\n",$1,$2,$3}‘ /etc/passwd
root : x :0
bin : x :1
//注意:#【.#】 + - ,也应该放到%后面
5.操作符:
算术运算操作符:
双目运算符:
x+y, x-y, x*y, x/y, x^y, x%y
[root@bogon html]# awk ‘END{print 5-4,5^2}‘ /etc/passwd
1 25
单目运算符:
-x:将正整数转换为负整数;
+x:将字符串转换为数值;
字符串操作符:
无任何操作符号时,即为字符串连接操作;
赋值操作符:
=, +=, -=, *=, /=, ^=, %=
++, --
比较操作符:
==, !=, >, >=, <, <=
[root@bogon html]# awk -F: ‘$3==1{print $1}‘ /etc/passwd
bin
//若是字符串比较需要加引号
模式匹配操作符:
~:操作符左侧的字符串是否能够被右侧的PATTERN所匹配;
!~:操作符左侧的字符串是否不能被右侧的PATTERN所匹配;
[root@bogon html]# awk -F: ‘$1~/root/{print $1,$3}‘ /etc/passwd
root 0
//PATTERN需要用双斜线扩住
逻辑运算操作符:
&&
||
!
示例:
~]# awk -F: ‘$3>=1000&&$3<=1100{print $0}‘ /etc/passwd
条件表达式:
selector(condition)?if-true-expression:if-false-expression
[root@bogon html]# awk -F: ‘{$1=="root"?type="super":type="laji";print $1,type}‘ /etc/passwd
root super
bin laji
//注意:变量赋值加引号
6.program的模式部分
1.啥也不写:处理每一行
2.模式内输入一些,内容或者关系表达式,可以在前面加入!选择不匹配
3.可以用NR的范围确定行的范围
4.俩个模式用逗号隔开,可以匹配范围内行
原文:http://blog.51cto.com/wangchaode/2105959