1.行与列
名词 | awk中的叫法 | 一些说明 |
---|---|---|
行 | 记录record | 每一行是通过回车分割 |
列 | 字段 域 field | 每一列默认通过空格(,)分割 |
所以awk中行列结束标记都可以修改。
awk内置变量
内置变量 | |
---|---|
NR | Number of record 记录号 行号 |
NF | Number of field 每行有多个字段(列),其中**$NF**表示最后一列 |
FS | -F: 等于 -v FS=: 字段分隔符 每个字段的结束标记 |
OFS | output 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[]+1 | array++ | 数组分类计数 |
注意:i sum都是变量
统计/etc/services 有多少空行
数字累加
seq 10 |awk '{sum+=$1}END{print sum}'
若要显示过程则
3.awk数组
用途:统计日志
统计次数
累加求和
shell数组 | awk数组 | ||
---|---|---|---|
形式 | array[0]=lcf array[1]=smy | array[0]=lcf array[1]=smy | |
使用 | echo $(array[0]) ${array[1]} | print array[0] array[1] | |
批量输出数组内容 | for i in ${array[*]} do echo $i done | for (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