awk是一个文本处理器,主要用于格式化文档输出

awk命令

  1.  格式:awk [option] ‘program’ file  (命令,选项,命令主体,文件)
     		命令主体部分:[/模式/]{动作}   (命令主体部分应该用单引号引起来)
     				模式部分可有可无:是用来决定何时触发awk,以及怎么触发
     				动作部分:决定怎么处理数据,需要将动作放到"{ }"中
     		选项部分:
     				-f,--file program-file:从指定的文件中加载program语句块,而不是通过命令行给出相关的程序内容;
     				-F,--field-separator fs:指定字段的输入分隔符;默认是空白字符;
     				-v,--assign var=val:用于声明自定义变量并为变量赋值;
    
    1. 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.俩个模式用逗号隔开,可以匹配范围内行