awk命令初级、高级篇(详细)

如果不好理解可以看图,图中有代码以及运行结果,就能明白。

目录

awk普通参数:

awk参数具体玩法:

1、-F 指定分隔符

 2、 -v 指定变量和默认值

3、$NF代表最后一个字段

4、NR 选行

5、&&与

 6、||或

 7、FS指定分隔符

 8、OFS一般与FS或者-F共同使用 

 9、RS指定结尾符一般与OFS配合

awk之优先级:

awk优先级详解

最高优先级 BEGIN:

 默认优先级PROGRAM(对数据源操作)

 END最低优先级

 awk之模糊匹配

 awk命令之控制流写法

awk之if判断语句

awk之for循环 

 awk之while循环

 awk之do...while写法

 循环控制语句beak(跳出当前循环)

 最后 awk小技巧


awk普通参数:

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

awk参数具体玩法:

1、-F 指定分隔符

#注意写法细节 awk -F ":" + 空格 + '{print $6}' 中间没有空格报错

tail -1 /etc/passwd | awk -F ":" '{print $6}' #指定分隔符“:”并截取第六个字段

运行结果:

 2、 -v 指定变量和默认值

seq 1 10 > 1.txt #生成一个1到10的文件,我想计算出文件内的总和

awk -v "a=0" '{a+=$1;print a}' 1.txt | tail -1  #给a赋值为0,让a与文件内的第一个字段相加,最后结果通过tail 打印出来 但是看的出来很麻烦

##优先级END 下面会有讲

awk -v "a=0" '{a+=$1}END{print a}' 1.txt  

运行结果:

3、$NF代表最后一个字段

awk -F ":" 'NR==10{print $NF}' /etc/passwd ##截取/etc/passwd文件下面的第五行,最后一个字段

 运行结果:

4、NR 选行

awk NR==44'{print $0}' /etc/passwd #打印/etc/passwd下的第44行,$0代表整行

运行结果:

5、&&与

条件1 && 条件2 都要满足才为真,真返回1,假返回0

awk -v "a=0" 'NR==1{print (a+=$1 > 10) && (a+=$2 >10)}' 2.txt ##如果条件为假则返回0

awk -v "a=0" 'NR==1{print (a+=$1 < 10) && (a+=$2 <10)}' 2.txt ##如果为真返回 1

运行结果

 6、||或

条件1 || 条件2 ##条件满足一边 为真

awk -v 'a=0' 'NR==1{print (a+=$1 >10) || (a+=$2 < 10)}' 2.txt #两个条件都不满足,返回假,也就是0

awk -v 'a=0' 'NR==2{print (a+=$1 >10) || (a+=$2 < 10)}' 2.txt #第二行,两遍条件满足一遍,所以结果为1

 ##以上代码  给a设置一个变量0 然后让a 去跟第一行的第一个相加 如果大于10 为真,如果为假 

运行结果

 7、FS指定分隔符

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

 运行结果

 8、OFS一般与FS或者-F共同使用 

写法:

awk -F ":" 'NR==2{OFS="_";print $1,$2}' 1.txt  #指定分隔符":",OFS中间的间隔换成你指定的

awk 'BEGIN{FS=":";OFS="-"}NR==2{print $1,$2,$3}' 1.txt #FS用法与上面意思相同

运行结果

 9、RS指定结尾符一般与OFS配合

写法单独写RS:

awk 'BEGIN{RS=""}{print $0}' 2.txt ##在文本操作的时候结尾默认是回车(\n),RS指定结尾符号

运行结果:

 RS与OFS配合使用写法:

注意 如果是$0的话,不会有效果,单独使用是可以,如果配合OFS使用就不能是整行

awk 'BEGIN{RS="";OFS="##"}{print $1,$2,$3}' 2.txt  ##RS指定结尾符,OFS指定链接符

#也可以指定特殊符号
awk 'BEGIN{RS="";OFS="\n"}{print $1,$2,$3}' 2.txt

运行结果

 

awk之优先级:


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

        注意:如果只用最高或者最低优先级,后面跟上数据源(file)不会有效果,只有默认优先级PROGRAM才会有效果
 

awk优先级详解

最高优先级 BEGIN:

##写法一

awk 'BEGIN{print "zhangsan"}'   #BEGIN后面不需要加任何数据源,也可以打印内容

运行结果:

##写法二(赋值写法)
awk 'BEGIN{a[1]="zhangsan";a[2]="28";print a[1],a[2]}' #将a[1],a[2]赋值,并打印

awk 'BEGIN{name="zhangsan";age="28";print name,age}'  #与上面同理

运行结果:

 默认优先级PROGRAM(对数据源操作)

        比如我想计算机内存使用率(总内存 - 空闲 *100 / 总内存)

awk 'NR==1{a=$2}NR==2{b=$2;print(a-b)*100/a"%"}' /proc/meminfo   #将总内存赋值给a,空闲内存赋予b ,在利用算法算出内存使用率,最后加入一个“%”看起来好看

运行结果:

 END最低优先级

对数据处理的最后一个值

seq 1 10  > 1.txt #生成一个1到10 的文件

awk -v "a=0" '{a+=$1}END{print a}' 1.txt #$1代表第一个字段,将第一个字段的所有数相加

运行结果:

   我们把第一个字段加起来了,会发现很多数值,我们就要最后一个结果,我们就加上END看两者的区别

 awk之模糊匹配

        比如说我想看我的用户信息,我就记得用户是gx开头的,我不打开文件下,我们可以这么做

awk -F ":" '$1 ~ "gx"{print $0}' /etc/passwd  #注意“~”匹配查询,后面关键字要用引号引起来一定要双引号 
#$1代表第一个字段,可以写成别字段比如第二字段就是$2...


#匹配多个写法
awk -F ":" '$1 ~"gx"{print $0};$1 ~ "roo"{print $0}' /etc/passwd 

运行结果:

 awk命令之控制流写法

参数:

if  判断控制语句
for 循环语句
while

循环语句 

do...while         循环
循环控制语句 break #只有break可以用

写法:

awk之if判断语句

awk '{if($1>5)print $1*$2;else print $1/$2}' 2.txt #如果$1大于5,$1乘以$2,否则$1除以$2

运行结果:

awk之for循环 

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

运行结果:

 awk之while循环

awk '{a=0;b=1;while(b<10){a+=$b;b++}print a}' 2.txt  #单条语句写法

##逐行写法

awk '{
sum=0
i=1
while (i<11) {
sum+=$i
i++
}
print sum 
}' 2.txt

运行结果:

 awk之do...while写法

awk '{a=0;b=1;do{a+=$b;b++}while (b<11)print a}' 2.txt  #do...while 就是将写在while中的语句拿出来写,最后while循环

##多行写法
awk '{
a=0
b=1
do{
a+=$b
b++}
while (b<11)
print a}' 2.txt

运行结果:

 循环控制语句beak(跳出当前循环)

#单行写法
awk '{a=0;b=1;while(b<4){a+=$b;if(a>150)break;i++}print a}' 2.txt ##判断如果文件当中第一个值大于150的话,就不与后面的值相加,直接打印

#多行写法
 awk '{
a=0
b=1
while (b<11) {
a+=$b
if (a >150)
break
b++
}
print a }' 2.txt

运行结果:

当第一个字段大于150的时候 不相加

文件中第一个字段大于150了就不与其他字段相加了

 最后 awk小技巧

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

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

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

运行结果:

猜你喜欢

转载自blog.csdn.net/weixin_58279299/article/details/124344404
今日推荐