awk的使用

1.行与列

名词awk中的叫法一些说明
记录record每一行是通过回车分割
字段 域 field每一列默认通过空格(,)分割

所以awk中行列结束标记都可以修改。

awk内置变量

内置变量
NRNumber of record 记录号 行号
NFNumber of field 每行有多个字段(列),其中**$NF**表示最后一列
FS-F: 等于 -v FS=: 字段分隔符 每个字段的结束标记
OFSoutput field separator 输出字段分隔符(awk显示每一列时每一列默认通过空格分隔)

1.1取行

awk
NR==1取出第一行
NR>=1&&NR<=5取出一到五行范围
/lcf/显示lcf匹配的行
/lcf/,/smy/输出lcf到smy的行
符号> < >= <= == !=
[root@foundation76 Desktop]# awk 'NR==1' 2
Awelcome nowcoder2121
[root@foundation76 Desktop]# awk 'NR>=1 &&NR<=5' 2
Awelcome nowcoder2121
Awelcome to nowcoder121
Bnowcoder11255
###

[root@foundation76 Desktop]# awk '/nowcoder/' 2
Awelcome nowcoder2121
Awelcome to nowcoder121
Bnowcoder11255
[root@foundation76 Desktop]# awk '/A/,/#/' 2
Awelcome nowcoder2121
Awelcome to nowcoder121
Bnowcoder11255
###

1.2取列

-F 指定分隔符 指定每一列结束标记(默认为空格 tab)
$数字:取出某一行
$0 表示整行的内容

在这里插入图片描述

取列时用{print $x}
$NF为最后一列

例子:
取出第一列和第九列
在这里插入图片描述
其中column -t 可以将每一列对齐方便观察

矩阵中行列中的行,横着行的叫row.竖着的列叫做column

若要将每列间用符号隔开则在两个$之间用双引号将内容添加即可比如'{print $1“##”$NF}'

例题:取ip
在这里插入图片描述
其中[ /]+ 的意思为以 空格或/ 一个或一个以上为分隔符
并且在第三行选第三个

若要调换第一列和最后一列的位置则用 -v OFS=:
在这里插入图片描述
-v为设置变量

2.awk模式匹配

比较符号: > < >= == !=
正则
范围 表达式
特殊条件:BEGIN END

2.1正则匹配

// 支持扩展正则
awk可以精确到某一列,某一列中包含包含~ /不包含!~…内容 用
~
第一列包含以s开头的行
在这里插入图片描述
若要找出第三列以1或2开头的行并显示第1 3最后的列则
在这里插入图片描述

2.2表示范围

/哪里开始/,/哪里结束/
或NR1,NR5

若要统计一段时间内的access.log的ip我们可以

awk '/14:03:00/,/20:30:00/{print $1}' access.log

2.3 特殊模式BEGIN{} END{}

模式含义应用场景
BEGIN{}里面的内容会在awk读取文件前执行1.进行简单统计计算不涉及读取文件 2.用来处理文件之前写个表头
END{}里面的内容会在awk读取文件后执行1.awk进行统计,一般统计:先计算,最后END输出结果 2.awk使用数组,用来输出结果

END{}统计计算

统计方法简写应用
i++i=i+1计数 统计次数
sum=sum+??sum+=??求和 累加
array[]=array[]+1array++数组分类计数

注意:i sum都是变量

统计/etc/services 有多少空行
在这里插入图片描述
数字累加

seq 10 |awk '{sum+=$1}END{print sum}'

若要显示过程则
在这里插入图片描述

3.awk数组

用途:统计日志
统计次数
累加求和

shell数组awk数组
形式array[0]=lcf array[1]=smyarray[0]=lcf array[1]=smy
使用echo $(array[0]) ${array[1]}print array[0] array[1]
批量输出数组内容for i in ${array[*]} do echo $i donefor (i in array) print array[i]awk数组专用循环,变量获取到的是数组的下标(中括号内的), 数组内容为array[i]

在这里插入图片描述
其中定义数组的是数字则不用加引号否则需要加**""**

经典案例:统计ip出现次数

http://www.nowcoder.com/index.html
http://www.nowcoder.com/1.html
http://m.nowcoder.com/index.html


awk -F/ '{array[$3]++}END{for(i in array) print i,array[i]}' nowcoder.txt #你要统计什么 []里就是什么(某一列)

www.nowcoder.com 4
hr.nowcoder.com 2
exam.nowcoder.com 1
m.nowcoder.com 3
如果排序以后顺序不对 则我们在后面可以 |sort -rnk2 r是逆序 n是数字 k2是根据第二列

若要统计access.log的状态号则(已知状态号在第九列)

awk '~/[0-9][0-9][0-9]/{array[$9]++}END{for(i in array) print i,array[i]}' access.log |sort -nrk2

4.循环与判断

4.1 for循环

shell编程中for循环格式为

for ((i=0;i<=10;i++))
do
	echo $i
done

而awk循环则为

for(i=0;i<=10;i++)
printi  #即awk循环用来循环每个字段

例子:输出1-100的和
在这里插入图片描述

4.2 if循环

shell中 if的判断

if [ "lcf" -eq 18 ];then
echo good
fi

awk if判断

if(条件)
print "good"
else
print "bad"

例子:统计磁盘空间使用率,若不足70,则反馈 显示磁盘分区,磁盘使用率,磁盘挂载点
在这里插入图片描述
注意:awk使用多个条件时第一个条件可以放在**‘条件{动作}’** 第二个条件一般使用if

经典案例:
统计这段语句中,单词中输出字符数小于6的单词。
how they are implemented and applied in computer
已知 统计字符数量的方法为

echo lcf | awk '{print length($1)}' #$0时统计整行

在这里插入图片描述


awk -F" " ‘{print $1}’ nowcoder.txt| xargs 中xargs可以转置
其原理为

echo 1 2 3 4 | xargs -n1
1
2
3
4
 
echo 1 2 3 4 | xargs -n2
1 2
3 4
 
echo 1 2 3 4 | xargs -n3
1 2 3
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lll_cf

喜欢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值