1 命令介绍
awk 是一个强大的文本分析工具,它可以在 Linux 或 Unix 系统下对文本文件进行处理。它可以读取文件,对文件的每一行进行处理,然后按照指定格式输出。除了能处理文本,它比sed和grep多一个功能,即可以处理数据(如加减乘除)
1.1 选项和参数
常见参数
- -F,fields,设置字段(一列)分隔符;(联想到cut -d)
- -v,var=value定义awk程序中的一个变量及其默认值(变量在代码里可以用,在外面定义在里面用)
用法
awk '条件类型1 {操作1} 条件类型2{操作2}...' filename
awk内置变量
- NF:每一行($0)拥有的字段总数
- NR:目前awk所处理的第几行数据
- FS:目前的分隔字符,默认是空格键,如果要修改成“:”,可以用{FS=":"},也可以用-F参数:指定分隔符,可指定一个或多个,比如-F '[ ,:]+',空格,逗号和冒号
2 输出结果
1)打印出特定的列
ps -ef | grep osd|awk '{print $13}'
2)打印特定的两列
top -d 2 -n 1 | grep PID -A5|awk '{print $6 " " $7}'
加了空行,但是看起来依旧没有对齐
可以使用制表符\t
top -d 2 -n 1 | grep PID -A5|awk '{print $6 "\t" $7}'
3)指定分隔字符,并且运用比较符
指定【:】为分隔字符,并且第三列的数值小于10
cat /etc/passwd| awk '{FS=":"} $3<10 {print $1 "\t\t" $3}'
第一行没有正确显示,因为读第1行,分隔行还是空格键
可以使用BEGIN,比如
cat /etc/passwd| awk 'BEGIN {FS=":"} $3<10 {print $1 "\t\t" $3}'
除了BEGIN还有END
BEGIN{} : BEGIN是在awk处理文本之前运行
END{} :当所有的处理全部执行完毕之后,执行END中的相关操作
这里shutdown行,没有对齐,可以使用 printf 可以确保即使某些字段是空的,输出也会按照预定的格式正确对齐。
printf 函数用于格式化输出。%-15s 表示左对齐的字符串,至少占据15个字符的宽度。如果用户名少于15个字符,它会在右侧填充空格以达到这个宽度。
cat /etc/passwd | awk -F: '$3<=10 {printf "%-15s\t%s\n", $1, $3}'
4)使用awk进行计算
先创建一个文件q.txt
1 100
2 200
3 300
每一行的第一列和第二列相加计算
每一列进行相加计算,如果只相加一行,可以通过下面的脚本
awk '{sum+=$2} END {print sum}' q.txt
如果需要每一列相加,需要为每一列分别维护一个累加器
awk '{sum1+=$1; sum2+=$2} END {print "Sum of column 1:", sum1; print "Sum of column 2:", sum2}' q.txt
5)awk进行查询
awk也可以如grep,sed一样进行查询
sed -n '/[0-9]$/p' a.txt
grep '[0-9]$' a.txt
6)NR,NF等内置参数的运用
7)自定义变量
awk -v x='ts' -v y='xx' '{print x,y}' q.txt
8)条件判断if .. else ..
awk '{if($1>=2) {x++} else {y++}} END{print "C1:"x"";print "C2:"y""}' q.txt
9)遍历数组
awk 'BEGIN{ \
a[0]=1;a[11]=22;a["book"]=32;a["work"]="home"; \
for(i in a){print i,a[i]} \
}'