一、这节课掌握如下几个知识点
【1】掌握awk的字符分隔
【2】掌握awk字符匹配的用法
【3】掌握awk流程控制的if判断
【4】掌握awk编程的循环for、while
二、代码讲解
先根据附件中的文档创建7.example.txt的测试文件。
#!/bin/bash
#7.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH
#1.文件中某一列的字符提取及字符切割
#$0-$NF 从第一列到最后一列
sed -n '1,3p' 7.example.txt #用sed将文件中的1到3行过滤出来
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print}' #用sed将文件中的1到3行过滤出来并通过awk全部打印
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $0}' #用sed将文件中的1到3行过滤出来打印第1列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $1}'#用sed将文件中的1到3行过滤出来打印第2列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $2}' #用sed将文件中的1到3行过滤出来打印第3列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $NF}'#用sed将文件中的1到3行过滤出来打印最后一列
echo "=================-F 切割参数"
awk -F '[ :]' 表示既可以是空格,也可以是冒号进行分隔
sed -n '5,7p' 7.example.txt #用sed将文件中的5到7行过滤出来
echo "--------------"
sed -n '5,7p' 7.example.txt|awk -F "," '{print $2}' #用sed将文件中的5到7行过滤出来并进行逗号切割后,打印第二列
echo "--------------NR 表示输入的行数"
sed -n '9,11p' 7.example.txt|awk -F ",|;" '{print $2}'#用sed将文件中的9到11行过滤出来并进行逗号,竖线,分号切割后,打印第二列
echo "--------------"
sed -n '9,11p' 7.example.txt|awk '{print NR}' #用sed将文件中的9到11行过滤出来并用awk输出行号
#2.字符串匹配
echo "=================="
sed -n '13,17p' 7.example.txt #用sed将文件中的13到17行过滤出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/{print $2}' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列匹配到10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /\<10010\>/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列绝对匹配10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/ && $NF ~ /liantong2/{print $2}'
#用sed将文件中的13到17行过滤出来,并将第一列匹配10010,和最后一列匹配liantong2的第二列打印出来
#3.awk中使用if判断
echo "=================="
sed -n '1,3p' 7.example.txt
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print $1,$2}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,然后将第一列、第二列打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '($2>=30)&&($1~/wang/){print $3}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,并且第一列匹配wang的行匹配出来并打印第三列
echo "--------------"
sed -n '19,22p' 7.example.txt
echo "--------------"
sed -n '19,22p' 7.example.txt|awk '{if (NR%2==0){print $0} else {printf "%s ",$0}}' #用sed将文件中的19到22行过滤出来,并将偶数列和奇数列分别打印不同的信息
echo "--------------"
sed -n '24,27p' 7.example.txt|awk '{ if(NR==2){print $0/4} else if(NR==4){print $0/3} else {print} }' #用sed将文件中的24到27行过滤出来,并将第二行的第一列除4,第四行的第一列除3,其余的全部打印。
#4.awk中使用循环for,while
echo 5 6 7 8|awk '{ for (i=1;i<=NF;i++) { if ($i>6) {print $i} } }' #循环判断5678,并打印大于6的值
echo 5 6 7 8|awk '{for (i=1;i<=NF;i++) { sum+=$i }; {print sum} }' #将5678求和
sed -n '24,27p' 7.example.txt|awk '{N+=$1} END {print N/NR}' #用sed将文件中的24到27行过滤出来,并求第一列数据的平均数
sed -n '24,27p' 7.example.txt|awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1 fi} END {print max}' #用sed将文件中的24到27行过滤出来,并求第一列的最大值
#awk默认按照字符串比较的,如果要比较数值,需要先强制类型转换,即 $1+0,转换成整数。
sed -n '24,27p' 7.example.txt|awk 'BEGIN {min = 65535} {if ($1+0 < min+0) min=$1 fi} END {print min}' #用sed将文件中的24到27行过滤出来,#求最小值
awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i; i++; } print total; }' #求1-100的累加
awk 'BEGIN{ total=0; i=0; do { total+=i; i++; }while(i<=100) print total; }' #求1-100的累加
三、课程附件
附件1:7.example.txt
xiaoming 23 1500
xiaodong 32 2300
xiaowang 43 3200
===========
xiaoming,23,1500
xiaodong,32,2300
xiaowang,43,3200
===========
xiaowang,43;3200
xiaowang;43,3200
xiaowang,43,3200
=========ƥӡ=
10086 cmc yidong
100860 ccc yidong2
10010 cnc liantong
100101 ccc liantong2
10000 ctc dianxing
==========if һ=
192.168.1.17
down
192.168.1.103
open
=======if-else===
125
32
126
54
==========
cc 750
aa 181
bb 37
bb 725
aa 42
cc 72
=====BEGIN END====
one:16.32
two:13.28
three:15.65