ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

awk语法

2021-10-25 12:58:22  阅读:248  来源: 互联网

标签:BEGIN sum 语法 test awk print root


一:awk介绍


  awk是一个行编辑器,可以把数据进行截取,同时完成数据的处理,输出

awk语法:

awk [options] [BEGIN]{program} [EDN][file]

awk程序运行优先级是:
(1)BEGIN:    在开始处理数据流之前执行,可选项
(2)program:   如何处理数据,必选
(3)END:    处理完数据后执行,可选项

二:awk基本用法---awk数据提取功能


(1)提取字段(列)

字段相关内置变量

$0表示整行文本
$1表示文本行中的第一个数据字段
$2表示文本行中的第二个数据字段
$N表示文本行中的第N个数据字段
$NF表示文本行中最后一个数据字段   

【例:打印整行文本和文本中的最后一个字段】

awk '{print $0}' test
awk '{print $NF}' test

(2)提取字段(行)

NR 指定行号
-F 指定分隔符

【例:打印第三行的所有】

awk 'NR==3{print $0}' test

【例:指定分隔符,打印第三行的第1,3,5字段】

awk -F ":" 'NR==3{print $1,$3,$5}' 文件

#可以将打印出来的格式改变,比如{print $1 "-" $3 "-" $5};
或者{print "account:" $1,"UID:" $3,"DESC:" $5}

二:awk的高级用法


【例1:查看内存使用率】

head -2 /proc/meminfo
#结果:
#head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print(t-f)*100/t "%"}'

【例2:变量】

awk 'BEGIN{name="wula";print name}'
#结果:
#[root@localhost shell]# awk 'BEGIN{name="wula";print name}'
 wula

【例3:数组】

awk 'BEGIN{array[1]="wulawula";array[2]="aowu";print array[1],array[2]}'
#结果:
#[root@localhost shell]# awk 'BEGIN{array[1]="wulawula";array[2]="aowu";print 
 array[1],array[2]}'
 wulawula aowu

【例4:awk支持运算】

(1)

 awk 'BEGIN{print "a">="b"}'
#结果:
 [root@localhost shell]#  awk 'BEGIN{print "a">="b"}'
 0

(2) 

seq 1 10 > num
cat num
awk '$1>5{print $0}' num    #打出第一列大于5的数
#结果
 [root@localhost shell]# awk '$1>5{print $0}' num
 6
 7
 8
 9 

(3)

awk 'BEGIN{print 100*3}'           #结果是输出300

 awk环境变量

变量     描述
FLELDWIDTHS  自定义字段宽度
FS输入字段分隔符号 
OFS   输出字段分隔符号
RS输入记录分隔符
ORS   输出记录分隔符号

【例:】

awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' passwd   #第1/2/3列分别占5/2/8字节

awk 'BEGIN{FS=":"}$1=="root"{print $0}' passwd

awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $0}' passwd

 awk流程控制

1.if语句

【例:num文件中,第一列比5小的数*2,否则/2】

awk '{if ($1<5)print $1*2;else print $1/2}' num
#结果
 [root@localhost shell]# awk '{if ($1<5)print $1*2;else print $1/2}' num
 2
 4
 6
 8
 2.5
 3
 3.5
 4
 4.5
 5

 2.for语句


【例:累加】

[root@localhost shell]# cat num2
60 50 100
150 30 10
70 100 40

横着写:

awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2
#[root@localhost shell]# awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2
 210
 190
 210

 3.改成while语句


1)竖着写:

[root@localhost shell]# awk '{
> sum=0
> i=1
> while (i<4) {
>   sum+=$i
>   i++
> }
> print sum
> }' num2
210
190
210

2)横着写

awk '{sum=0;i=1;while (i<4){sum+=$i;i++}print sum}' num2

 4.break跳出循环


【例:当合大于150跳出循环】
1)竖着写

[root@localhost shell]# awk '{
> sum=0
> i=1
> while (i<4) {
>    sum+=$i
>    if (sum>150)
>      break
>    i++
> }
> print sum }' num2
210
180
170

2)横着写

awk '{sum=0;i=1;while(i<4){sum+=$i;if (sum>150)break;i++}print sum}' num2

三:awk小技巧


(1)打印test文本行数
    awk 'END{print NR}' test
(2)打印test文本列数
    awk 'END{print NF}' test
(3)打印test文本最后一行内容
    awk 'END{print $0}' test


补充:
head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。
命令格式:

head [参数] [文件]  
-q 隐藏文件名
-v 显示文件名
-c<数目> 显示的字节数。
-n<行数> 显示的行数。

标签:BEGIN,sum,语法,test,awk,print,root
来源: https://blog.csdn.net/Hwulawulawula/article/details/120941722

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有