awk语法

一: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<行数> 显示的行数。

上一篇:ML&DL_3——多层感知机


下一篇:2021-10-15