1、定义
awk:按行取列
awk的默认分隔符:空格,tab键,有多个空格自动压缩成一个
2、awk的工作原理
根据指定信息逐行的读取文本内容,然后按照条件进行格式化输出
3、awk的选项
-F:指定分割符,默认是空格
-v:变量复制
4、内置变量
$#:按行需要取出的第几个字段
$0:打印所有,展示所有的文本内容(默认)
NR:需要处理的行号
NF:处理行的字段个数,$NF:当前行的最后一个字段
FS:FS和F都是指定分隔符,FS=","
OFS:指定输出内容的分隔符
RS:行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行
5、命令格式
awk -F '操作符 {动作}' 处理对象
-F 指定分隔符,如果是空格可以不加
动作:默认是打印
打印行号:
awk '{print NR}' 文件
打印行号和内容:
awk '{print NR,$0}' 文件
打印指定行:
awk 'NR==3{print}' 文件
打印第3行到第5行:
awk 'NR==3,NR==5{print}' 文件
打印第3行和第5行:
awk 'NR==3;NR==5{print}' 文件
打印偶数行:
awk 'NR%2==0{print}' 文件
打印奇数行:
awk 'NR%2==1{print}' 文件
指定分隔符:
awk -F分隔符 'print $第几字段' 文件
6、awk怎么使用文本过滤
过滤包含root的行:
awk '/root /{print}' /etc/passwd
7、BEGIN打印模式
awk 'BEGIN{...};{...};END{...}' 文件
BEGIN{...}预先的条件,指定awk命令前的初始化操作
{...}处理条件,如何对初始值进行操作
END{...}处理完之后的操作,一般都是打印
awk 'BEGIN{x=1};{x++};END{print x}' 文件
取幂运算:
awk 'BEGIN{print 2**3}'
awk 'BEGIN{print 2^3}'
-v进行赋值:
read -p "输入一个数: " a
read -p "输入次方:" b
num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a^b}')
echo $num
8、awk的条件判断打印
打印第三列所有大于999的
awk -F: '$3>999{print $0}' /etc/apsswd
取反
awk -F: '!($3>999){print $0}'
打印第3行等于999
awk -F: '$3==999{print $0}'
9、awk的三元表达式
if
else语句
awk -F:'{num=($3>$4)?$3:$4;{print num,$0}}' /etc/passwd
num=($3>$4)?$3:$4;
? if
:else
; fi
10、awk的精确筛选
$n(><==) 用于比较数值之间的大小
$n~"字符串" :表示该字段包含某个字符串
$n!~"字符串“ :该字段不包含某个字符串
$n=="字符串" :该字段等于这个字符串
$n!="字符串" :该字段不等于这个字符串
打印第七列包含bash这个字段的行,取的是行的第一列和最后一列,以:作为分隔符
awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd
打印第七列包含bash这个字段的行,取的是行的第一列到第三列,以:作为分隔符
awk -F: '$7~"bash" {print $1,$2,$3}' /etc/passwd
打印第七列不包含bash这个字段的行,取的是行的第一列到第三列,以:作为分隔符
awk -F: '$7!~"bash" {print $1,$2,$3}' /etc/passwd
打印第七列等于/bin/bash这个字段的行,取第一列和第二列
awk -F: '$7=="/bin/bash" {print $1,$2}' /etc/passwd
11、逻辑关系
打印第三行的第三列
cat awk.sh | awk 'NR==3{print $3}'/10
打印/etc/passwd第一列=dn,第七列=/bin/bash
awk -F: '($1=="dn")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd
12.1作用
是一个功能强大的命令
作用:获取和发送数据
curl www.baidu.com
curl 192.168.230.20
12.2获取网页内容并输出
-O:下载文件到本地
-o:将文件下载到指定的路径
-x:发送post请求
-i:可以获取web软件的版本(服务端没有隐藏版本号)
13、awk的运算
num=$(awk 'BEGIN{print 1.243+4.932}')
取小数点后两位(四舍五入)
num=$(awk 'BEGIN{printf "%.2f", 1.243*4.932}')
只取整数
num=$(awk 'BEGIN{printf "%.F", 1.243*4.932}')
练习1:使用awk,将主机名取出来
[root@localhost opt]# cat test2.txt
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.co
[root@localhost opt]# cat test2.txt | awk -F'[ .]+' '{print $2}'
www
ftp
linux
blog
练习2:使用awk,统计/etc下文件的总大小
ll /etc | awk '/^-/{print sum+=$5} END{print "文件的总大小:"sum/1024"M"}'