awk是一个文本处理器,主要用于格式化文档输出html
awk命令express
格式:awk [option] ‘program’ file (命令,选项,命令主体,文件)
命令主体部分:[/模式/]{动做} (命令主体部分应该用单引号引发来)
模式部分无关紧要:是用来决定什么时候触发awk,以及怎么触发
动做部分:决定怎么处理数据,须要将动做放到"{ }"中
选项部分:
-f,--file program-file:从指定的文件中加载program语句块,而不是经过命令行给出相关的程序内容;
-F,--field-separator fs:指定字段的输入分隔符;默认是空白字符;
-v,--assign var=val:用于声明自定义变量并为变量赋值;数组
awk中的一些概念:
a.分隔符:
输入分隔符:awk处理数据时,会根据特定的标识符号把数据分段,这种标识符就是输入分隔符,默认为空白符
输出分隔符:将数据处理完成后,会用分隔符将这些分段的数据链接起来,这样的分隔符叫输出分隔符;默认也为空白符;bash
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:输入字段分隔符,默认空白符ide
[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:输入换行符,用来分隔记录的code
[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用空格隔开或没隔开,则输出的结果将不会有输出分隔符htm
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.俩个模式用逗号隔开,能够匹配范围内行字符串