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