AWK的简单用法

AWK的简单介绍

1. awk:报告生成器,格式化文本输出
2. 版本:New awk (nawk) ,GNU awk (gawk)
3. gawk:模式扫描和处理语言
4.基本的用法
	1):awk [options] 'program' 
	2):awk [options] -f programfile var=value file…
	3):awk [options] 'BEGIN{action;… }pattern{action;… }END{action;… }' file ...
	awk程序是由:BEGIN语句;能够使用匹配模式的通用语句块,END语句块,3部分组成;其中:BEGIN开始执行,END:后执行
5.awk的基本选项
		-F:分隔符:指明输入的时候用到的;默认的是空白
		-v:var="ssd" 变量赋值
列子:
awk -F: 'BEGIN{print 100*2}{print 12356}END{print $1}' /etc/fstab

AWK的语言

1.基本的格式:awk [options] 'program'  filename
2.Program:pattern{action   statements;....}
3.pattern和action
	pattern:部分决定了动作语句何时触发事件;BEGIN,END
	action:statements对数据进行处理,放在{}指明动作;print  / printf
4.分割符和域
		awk执行时,由分隔符分割的字段(域)$1,$2....$n;称为域的标识,$0:表示为所有的域,
		**注意事项:awk中的$2等与shell脚本中使用$1符号的含义是一样的**
		文件的每一行称为记录
		省略action,则默认执行 print $0 的操作
	只显示匹配到的条件
	awk -F: '{print $1,$3}' /etc/passwd
	显示所有内容
	awk -F: '{print $0}' /etc/passwd

AWK的工作原理

1.开始执行BEGIN{action.....}语句块中的语句
2.从文件或标准输入读取一行,然后执行pattern{action.....}语句块,会逐步扫描文件,从第一行到最后一行重复这个操作,一直到文件被读取完
3.当文件被读取到末尾时,开始执行END{action;。。。}语句块
4.BEGIN语句在awk开始从输入流中读取文件之前被执行,这BEGIN是可选语句,比如:初始化变量,打印表头等通常可以写在BEGIN语句块中
5.END语句块在awk从输入流中读取完所有的行之后,才被执行
6.pattern语句块中是命令中最为重要的部分,可以选的;没有提供pattern语句块,则默认执行{print},也就是每一个读取到的行,awk读取的每一行都将执行该语句块

awk中print

1.print 格式:print itme1,itme2.....
2.要点:
	[,]作为分隔符
	输出itme可以是字符串,也可是数值,当前记录的字段,变量或者是awk表达式
	(注意事项:'{print  "呵呵呵呵呵"}'字符串必须给双引号;否则会被识别为变量;数值可以不给)
	如省略item,相当于print $0
3.awk 也支持正则表达式
4.wak内置了循环
	正则表达式:
	df | awk -F " +|%"  '/^\/dev\/sda/{print $1,$5}' | sort -nr | head -1
		{$1,$5} 的这个【, 可以换成其他的代替;但是必须用双引号,引起来
	df | awk -F " +|%"  '/^\/dev\/sda/{print $1"dayu"$5}' | sort -nr | head -1
	内置的循环
	awk  '{print "Hello,awk"}' ----->会进入交互式模式,等待输入,没输入一行,打印一次hello awk
	默认的域是 $0;读取文件的所有内容并显示
	awk '{print }'  /etc/passwd 等同于 awk '{print $0}' /etc/passwd
	/etc/passwd中有多少行,就打印多少
	awk -F: '{print "wenjian "}' /etc/passwd
	显示passwd中所有所用户和uid
	awk  -F:'{print $1,$3}'  /etc/passwd
	用空格作为分隔
	awk  -F:'{print $1"\t"$3}'  /etc/passwd
	awk  -F:'{print $1"+=======================+"$3}'  /etc/passwd

AWK的变量

	**1.awk的内置变量**
			FS:输入字段的分割符,默认为空白
			OFS:输出字段分割符,默认是空白
			RS:输入记录分割符,指定输入时的换行符
			ORS:输出记录分隔符,输出时用指定的符号代替换行符
			NF:字段数量
			NR:记录号
			FNR:各文件分别计数,记录号
			FILENAME:当前的文件名
			ARGC:命令行的参数
			ARGV:数组,保存的是命令行所给定的各个参数
	**2.	自定义变量区分字符的大小写**
			-v var="value"
			在program中直接定义	
在引用变量时,不需要在前面加$
	FS:列子
		awk -v FS=":"  '{print $1FS$3}'  /etc/passwd
		awk -F: '{print $1,$7,$3}'  /etc/passwd
	OFS:列子
		awk -v FS=':' -v OFS='----' '{print $1,$3,$7}' /etc/passwd
	RS:
		awk -v RS=''  '{print}' /etc/passwd
	ORS
		awk -v RS=":" -v ORS="*******" '{print}' /etc/passwd
	NF:
		awk -F: '{print NF}' /etc/passwd
	NR:
		awk -F '{print NF,NR}' /etc/passwd
		awk END'{print NR}' /etc/fstab	
	FNR:
		awk '{print FNR}' /etc/passwd /boot/grub
	FILENAME
		awk '{print FILEANME}'  /boot/grub
	ARGC:
		awk '{print ARGC}' /etc/passwd /etc/fstab
	ARGV 
		awk '{print ARGC,ARGV[0],ARGV[1],ARGV[2]}'/etc/passwd /etc/fstab --->可以具体显示出有哪些参数 ARGV[0] 数组 下标

自定义变量
	awk -v test="hell" 'BEGIN{print test}' 
	awk 'BEGIN{test="ni hao";print test}'
	awk -F: '{sex="male";print $1,sex,age;age=18}'/etc/passwd

printf命令

1.格式化输出:printf  "FORMAT"  ,itme1,itme2...
		必须指定FORMAT
		不会自动换行,需要给显示给出换行控制符\n
		FORMAT中需要分别对应后面的每一个itme指定格式符
	2.格式符:与itme相对应的
		%c:显示字符的ASCII码
		%d,%i:显示十进制在整数
		%e,%E:显示科学计数法计数
		%f:显示为浮点
		%g,%G:以科学计数法或浮点形式显示数值
		%s:显示字符串
		%u:无符号整数
		%%:显示%自身
	3.修饰符号
		#[.#] 第一个数字控制显示的宽度,第二个#表示小数点后的精度,比如%3.1f
		-:左对齐,(默认是右对齐) %-10s
		+  	显示数值的正负符号  %+d
printf 案列
	awk -F: '{printf "%s",$1}' /etc/passwd
	awk -F: '{printf "%s\n",$1}' /etc/passwd
	awk -F: '{print "%-20s %10d\n",$1,$3}' /etc/passwd
	awk -F: '{printf "Usrname: %s,UID:%d\n",$1,$3}' /etc/passwd
	awk -F: '{printf "Usrname: %-20s,UID:%10d\n",$1,$3}' /etc/passwd
	awk -F: 'BEGIN{print "----------------------------------------------------"}{printf "Usrname:|-  %-20s |  UID:|  %10d\n",$1,$3}' /etc/passwd
	awk -F: 'BEGIN{print "USERNAME-----------------------------------------UID"}{printf " %-20s ------|-------    %10d\n",$1,$3}' /etc/passwd

操作符号

1.算术操作
		x+y, x-y, x*y, x/y, x^y, x%y
		- x:转换为负数
		+x:将字符串转换为数值
2.字符串的操作符,没有符号的操作符,字符串连接
3.赋值操作符
	=, +=, -=, *=, /=, %=, ^=,++, --
4.比较操作符
	==, !=, >, >=, <, <=
5.模式匹配符
	~:左边是否匹配右边;包含
	!~:是否不匹配
6.逻辑操作符
	与&& 或|| 非!
7.三目表达式
	selector?if-true-expression:if-false-expression
	前面为真,执行中间,前面为假,执行结尾
awk 'BEGIN{i=0;print ++i,i}'  值为11
awk 'BEGIN{i=0;print i++,i}'  值为01
第一个先加在打印
第二个先打印在加
awk -F: '$0 ~ /root/{print $1}' /etc/passwd
awk -F: '$0 ~ /root/{print $0}' /etc/passwd
awk '$0!~ "root"' /etc/passwd
awk -F: '$3==0' /etc/passwd

逻辑操作符:
awk -F: '$3>=0 && $3<=600{print $1,$3}' /etc/passwd
awk -F: '$3>=0 || $3<=600{print $1,$3}' /etc/passwd
awk -F: '!($3==0){print $1}' /etc/passwd
awk -F: '!($3>=500){print $3}' /etc/passwd
三目表达式:
awk -F: '{$3>=1000?USRNAME="common user":USERNAME="system user";printf "%-15s:%s\n",USERNAME,$1}' /etc/passwd

AWK PATTERN

1.pattern :根据pattern条件,过滤匹配到的行,在进行处理,
	1)如果没有指定,匹配文本每一行
	2) /regular expression/:处理仅能匹配到的行,需要使用【//】括起来
				awk '/^UUID/{print $1}' /etc/fstab   :取出开头为UUID
				awk '/!UUID/{print $1}' /etc/fstab:取反,不是UUID的第一行
	3)	relational expression: 关系表达式,结果为“真”才会被处理
			真:结果为非0值,非空字符串
			假:结果为空字符串或0值
	4)	line ranges:行范围 (跟sed的   '//,//'一样)
			startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式
	5)	BEGIN/END模式
			BEGIN{}:仅在开始处理文件中的文本之前执行一次
			END{}:仅在文本处理完成之后执行一次
	awk -F: 'i=1;j=1{print i,j}' /etc/passwd
	awk '!0' /etc/passwd ; awk '!1' /etc/passwd
	awk '$3>=1000{print $1,$3}' /etc/passwd
	awk -F: '$3<1000{print $1,$3}' /etc/passwd
	awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
	awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
	awk -F: '!($NF=="/bin/bash"){print $1,$NF}' /etc/passwd
	awk -F: '$NF~"/bash" {print}' /etc/passwd
	awk -F: '!($NF~"/bash") {print}' /etc/passwd
范围的表示
	awk '/^root\>/,/^nobo\>/{print $1} ' /etc/passwd
	df | awk -F " +|%" '/^\/dev\/sda/{print $1,$5}'
	awk -F : ‘BEGIN {print “USER USERID”} {print $1“:”$3}  END{print “END FILE"}' /etc/passwd
	awk -F : '{print "USER USERID“;print $1":"$3} END{print "END FILE"}' /etc/passwd
	awk -F: 'BEGIN{print " USER UID \n--------------- "}{print $1,$3}' /etc/passwd
	awk -F: ‘BEGIN{print  USER UID \n--------------- }{print 
	$1,$3}’END{print ==============} /etc/passwd
	seq 10 | awk 'i=0'
	seq 10 | awk 'i=1'
	seq 10 | awk 'i=!i'
	seq 10 | awk '{i=!i;print i}'
	seq 10 | awk !(i=!i)' 
	seq 10 |awk -v i=1 'i=!i'

for循环##

样例一:
#!/bin/bash
for((i=1;i<=100;i++));
do
echo $i
done

样例二:
#!/bin/bash
for i in $(seq 1 100)
do
echo $i
done

样例三:
#!/bin/bash
awk 'BEGIN{for(i=1; i<=100; i++) print i}'

样例四:
#!/bin/bash
for i in {1..100}
do
echo $i
done

版权声明:本文为weixin_44232712原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。