awk

awk基础语法

awk [options] ‘program’ file1 , file2 , 

//对于上述语法中的program来说,又可以细分成pattern和action
awk [options] ‘Pattern{Action}file

普通参数

-F 指定分隔符
-v 指定变量和默认值
$NF 代表最后一个字段
NR 代表第几行
&&
||
FS 输入分隔符,与-F分隔符一样
OFS 输出字段分隔符
RS 输入记录分隔符
$0 显示整行
1…N 第一个字段到第N个字段

实例

#注意写法细节 awk -F ":" + 空格 + '{print $6}' 中间没有空格报错
tail -1 /etc/passwd | awk -F ":" '{print $6}' #指定分隔符“:”并截取第六个字段


#FS没有优先级写法
awk '{FS=":"}NR==2{print $1,$2}' 3.txt
#FS优先级写法
awk 'BEGIN{FS=":"}NR==2{print $1,$2}' 1.txt


awk -F ":" 'NR==2{OFS="_";print $1,$2}' 1.txt  #OFS指定分隔符":",OFS中间的间隔换成你指定的
awk 'BEGIN{FS=":";OFS="-"}NR==2{print $1,$2,$3}' 1.txt #FS用法与上面意思相同

最高:BEGIN是最高优先级,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及任何数据,也不依赖PROGRAM代码块;
默认:PROGRAM是对数据流干什么,是必选代码块,也是默认代码块。所以执行的时候必须要加上数据源; 默认优先级(不加优先级就是默认)
最低:END是处理完数据流后,如果需要执行END代码块,就必须要PROGAM的支持,单个无法执行

awk命令之控制流写法

if 判断控制语句
for 循环语句
while 循环语句
do…while 循环
循环控制语句 break #只有break可以用
awk '{if($1>5)print $1*$2;else print $1/$2}' 2.txt #如果$1大于5,$1乘以$2,否则$1除以$2

awk '{a=0;for(i=1;i<11;i++){a+=$i}print a}' 2.txt  ##初始化值a,然后内容有几行循环就几次,最后将字段相加,就是结果了

awk小技巧

awk 'END{print NR}' /etc/passwd  #可以打印一个文件下有多少行

awk 'END{print $0}' /etc/passwd #可以打印最后一行

awk -F ":" 'END{print NF}' /etc/passwd #可以打印文件内最后一行有多少个字段
##如果文件内有分隔符,需要指定分隔符

cat example.txt | awk 'NR%2==1'     #删除example.txt文件中的所有偶数行
echo "    false" |awk -F' ' '{print $NF}'        #去掉前面的空格
docker images | grep 'mysql' | awk '{printf"%s:%s\n",$1,$2}'    #获取镜像名:Tag
ps -ef | grep java | grep -v 'color' awk '{for (i=8;i<=NF;i++)printf("%s ", $i);print ""}' #获取从第八列开始到最后一列的内容

# 打印各磁盘可用大小
df | grep -v tmpfs | awk 'NR!=1 {disk[$1]=$4} \
END {for(i in disk) {printf "%-20s %-10s\n",i,disk[i]/1024"M"}
}'

   转载规则


《awk》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录