一.基本介绍
1.awk:
awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的。awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个段,段和段之间使用分割符分割。
2.功能:流控制、数学运算、进程控制、内置的变量和函数、循环和判断
3.工作原理:
awk 会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。
(1)行工作模式,读入文件的每一行,会把一行的内容,存到$0里
(2)使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100)
(3)输出的时候按照内置变量OFS(out FS),输出
(4)读入下一行继续操作
简单实例
[root@SERVER-Test testperl]# echo "this is a book" >./awk.txt
[root@SERVER-Test testperl]# awk '{print $2,$1,$3,$4}' awk.txt
is this a book
4. Awk常用内置变量表:
1 $0 整个文本内容
2 $1~$n 当前记录的第n个字段,字段间由FS分隔
3 FS 输入字段分隔符 默认是空格
4 OFS 输出字段分隔符 默认也是空格
5 NF 统计当前正在处理行有多少字段个数,就是每行有多少列
6 NR 记录已经读入处理的行数,从1开始(所有文件的读取的行数)
7 FNR 当前读取的文件已经处理的行数(所有文件中的一个文件)
7 RS 输入的记录分隔符,默认为换行符
8 ORS 输出的记录分隔符,默认为换行符
9 ARGC 命令行参数个数
10 ARGV 命令行参数数组
11 FILENAME 当前输入文件的名字
12 IGNORECASE 如果为真,则进行忽略大小写的匹配
13 ARGIND 当前被处理文件的ARGV标志符
14 CONVFMT 数字转换格式 %.6g
15 ENVIRON UNIX环境变量
16 ERRNO UNIX系统错误消息
17 FIELDWIDTHS 输入字段宽度的空白分隔字符串
18 FNR 当前记录数
19 OFMT 数字的输出格式 %.6g
20 RSTART 被匹配函数匹配的字符串首
21 RLENGTH 被匹配函数匹配的字符串长度
二.print的简单使用
例:打印文本所有的数据): $0
[root@SERVER-Test testperl]# cp /etc/passwd pl
[root@SERVER-Test testperl]# awk -F : '{print $0}' pl
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
打印这个文本每行有多少列
[root@SERVER-Test testperl]# cat asd.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam
[root@SERVER-Test testperl]# awk '{print NF}' asd.txt
4
5
4
5
4
5
4
5
例:打印每行的最后一个字段: $NF(也就是求asd.txt的$4这一列内容)
[root@SERVER-Test testperl]# cat asd.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam
[root@SERVER-Test testperl]# awk '{print $NF}' asd.txt
cat
betty
dog
frank
fish
george
goat
adam
显示文本的一行中的第一个与第二个参数,中间可以加#号
[root@SERVER-Test testperl]# cat awk.txt
this is a book
[root@SERVER-Test testperl]# awk 'BEGIN{OFS="#"}{print $1,$2}' awk.txt
this#is
例:打印第三个字段: $3
[root@SERVER-Test testperl]# awk -F : '{print $3}' pl
0
1
2
例:打印第一行使用NR==1
[root@SERVER-Test testperl]# awk 'NR==1{print $0}' pl
root:x:0:0:root:/root:/bin/bash
例:打印最后一行
[root@SERVER-Test testperl]# awk -F : 'END{print $0}' pl
mockbuild:x:507:507::/home/mockbuild:/bin/bash
例:打印第一行第一个字段
[root@SERVER-Test testperl]# awk -F : 'NR==1{print $1}' pl
root
例:打印第一行最后一个字段
[root@SERVER-Test testperl]# awk -F : 'NR==1{print $NF}' pl
/bin/bash
例:打印最后一行最后一个字段
[root@SERVER-Test testperl]# awk -F : 'END{print $NF}' pl
/bin/bash
例:打印最后一行第一个字段
[root@SERVER-Test testperl]# awk -F : 'END{print $1}' pl
mockbuild
例:打印每行的倒数第二个字段,并在其后打印你好
[root@SERVER-Test testperl]# awk -F : '{print $(NF-1),"nihao"}' pl
/root nihao
/bin nihao
/sbin nihao
例:打印行号
[root@SERVER-Test testperl]# awk -F : '{print NR,$0}' pl
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
例: 用:分割,删除第2个字段
[root@SERVER-Test testperl]# awk -F : 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$5,$6,$7}' pl
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:/sbin/nologin
例如:显示文本中的参数,还可以加修饰符,还可以加字符串
[root@SERVER-Test testperl]# cat test.sh
this is a test zxc abc
[root@SERVER-Test testperl]# awk 'BEGIN{OFS="::"}{print $1"1234",$5,"hello"$6}' ./test.sh
this1234::zxc::helloabc
显示文本的一行中的第一个与第二个参数,中间可以加#号
[root@SERVER-Test testperl]# awk -F : 'BEGIN{OFS="#########"}{print $1,$5,$4}' ./passwd |head -2
root#########root#########0
bin#########bin#########1
输出三行,注意换行需要加\n
[root@SERVER-Test testperl]# awk 'BEGIN {print "line one\nline two\nline three"}'
line one
line two
line three
输出重定向>和>>
[root@SERVER-Test testperl]# awk -F : '{printf "%-10s%-15s\n", $1,$3 > "/root/testperl/1111.txt"}' /etc/passwd
[root@SERVER-Test testperl]# cat 1111.txt
root 0
bin 1
daemon 2
adm 3
例如:
[root@SERVER-Test testperl]# cat 1111.txt
root 0
bin 1
daemon 2
adm 3
lp 4
[root@SERVER-Test testperl]# awk -F: '{printf "%-10s%-15s\n", $1,$3 >> "/root/testperl/1111.txt"}' /etc/passwd
[root@SERVER-Test testperl]# cat 1111.txt
root 0
bin 1
daemon 2
adm 3
lp 4
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
自定义变量
例如:定义var=hello test
[root@SERVER-Test testperl]# awk -v var="hellow test" 'BEGIN {print var}'
hellow test
或者上面自定义也可以改成下面格式
[root@SERVER-Test testperl]# awk 'BEGIN {var="hello test";print var}'
hello test
四.awk的使用
(1)正则表达式
\(\) \{\} 不支持
. * ^ $ ? + [] | \< \> () 可以直接使用
~(匹配) !~(不匹配)
例:
[root@SERVER-Test testperl]# awk -F : '/^root/{print $1.$NF}' pl
root/bin/bash
例:
[root@SERVER-Test testperl]# awk -F : '!/^root/{print $1.$NF}' /etc/passwd | head -3
bin/sbin/nologin
daemon/sbin/nologin
adm/sbin/nologin
例:
[root@SERVER-Test testperl]# awk '/^$/{print "this is an empty line"}' ./passwd
this is an empty line
this is an empty line
例如:打印出第3列等于0,第7列匹配nologin的打印出来
[root@SERVER-Test testperl]# awk -F: '$3==0,$7~/nologin/ {print $1,$3,$7}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
例如:打印出第3列大于500的内容
[root@SERVER-Test testperl]# awk -F: '$3+1>500 {print $1,$3,$5}' /etc/passwd
www 500
mysql 501
redis 502
liweiguan 503
zabbix 504
elite 505
haojue 506
mockbuild 507
例如:打印出第7列匹配bash结尾的内容(~指匹配)
[root@SERVER-Test testperl]# awk -F: '$7~/bash$/ {print $1,$7}' /etc/passwd
root /bin/bash
redis /bin/bash
liweiguan /bin/bash
elite /bin/bash
haojue /bin/bash
mockbuild /bin/bash
例如:打印出第7列不匹配bash结尾的内容{ !~(不匹配)}
[root@SERVER-Test testperl]# awk -F: '$7!~"bash$" {print $1,$7}' /etc/passwd | head -5
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
例如:对模式进行格式化操作
[root@SERVER-Test testperl]# awk -F: '$3==0,$7~/nologin/ {printf "%-10s%-15s%-20s\n", $1,$3,$7}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
如果我想添加表头,则需要添加GEGIN
[root@SERVER-Test testperl]# awk -F: 'BEGIN {print "Username ID SHELL"} {printf "%-10s%-15s%-20s\n", $1,$3,$7}' /etc/passwd | head -5
Username ID SHELL
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
当然也可以添加一个表的结尾
[root@SERVER-Test testperl]# awk -F: 'BEGIN {print "Username Id SHELL"} {printf "%-10s%-15s%-20s\n", $1,$3,$7} END {print "The report is end"}' /etc/passwd
Username Id SHELL
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
haojue 506 /bin/bash
mockbuild 507 /bin/bash
The report is end
Empty(空模式):匹配任意输入行,对文件中的每一行做匹配
例如:
[root@SERVER-Test testperl]# awk -F: '{printf "%-10s%-15s%-20s\n", $1,$3,$7}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
(2)关系运算符
> < == != >= , =, %1选择第二个字段比第一个字段长的行。
模式匹配表达式:指定一个行的范围。该语法不能包括BEGIN和END模式。
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作
END:在最后一条输入记录被读取之后发生的动作。
五.awk里的流控制和循环
(1)简单的条件判断
语法:(表达式 ? 值1 : 值2) 如果表达式成立,输出值1;否则输出值2
[root@SERVER-Test testperl]# cat 123
2 8 9 4
7 5 7 3
3 7 5 9
[root@SERVER-Test testperl]# awk '{print ($1>$2 ? $1:$2)}' 123
8
7
7
例:
[root@SERVER-Test testperl]# cat 123
2 8 9 4
7 5 7 3
3 7 5 9
[root@SERVER-Test testperl]# awk '{print ($2=500) sum++} END{print sum}' /etc/passwd
8
例
[root@SERVER-Test testperl]# cat 123
zx 90 98 34
cv 98 80 89
bn 88 87 90
[root@SERVER-Test testperl]# awk '{if ($2>=80 && $2=90 && $2=80 && $2=70 && $2=60 && $2=8)}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
(4)for循环
语法:
{
for(表达式)
{动作1;...}
}
表达式:分为3部分:
(1)初始化表达式 i=1
(2)测试表达式 i
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com