文章目录
awk
概述
awk是一种处理文本文件的语言,是一个强大的文本分析工具。
专门为文本处理设计的编程语言,是行处理软件,通常用于扫描、过滤、统计等。
数据来自标准输入或管道。
工作原理
逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
Awk基本语法
命令格式
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
模式可以为条件语句,复合语句或正则表达式
在使用 awk 命令的过程中,可以使用逻辑操作符
“&&”表示“与”、“||” 表示“或”、“!”表示“非”;
还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方
单引号加上大括号“{}”用于设置对数据进行的处理动作
awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理
Awk用法示例
awk ‘{print}’ 默认什么都不加,打印出文件本身
[root@yzq mnt]#awk '{print}' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
awk '{print $1}' passwd awk默认情况下字段的分隔符为空格或 tab 键,如果文件没有分隔符即打印全部文件
awk '{print $0}' passwd 打印出文件本身
以:为分隔符分割
-F后面所跟分隔符可自己定义
[root@yzq mnt]#awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
打印出东西的格式
如果是‘{print $1,$2}’,打印的每列之间默认有空格
[root@yzq mnt]#awk -F: '{print $1,$2}' passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
如果是‘{print $1 $2}’,打印的每列无空格
[root@yzq mnt]#awk -F: '{print $1 $2}' passwd
rootx
binx
daemonx
admx
lpx
syncx
shutdownx
haltx
mailx
operatorx
如果需要指定打印列之间的符号可使用‘{print $1“ ”$2}’,在“”中间自定义加上自己需要打印出的方式
[root@yzq mnt]#awk -F: '{print $1"--"$2}' passwd
root--x
bin--x
daemon--x
adm--x
lp--x
sync--x
shutdown--x
halt--x
mail--x
operator--x
[root@yzq mnt]#awk -F: '{print $1"_"$2}' passwd
root_x
bin_x
daemon_x
adm_x
lp_x
sync_x
shutdown_x
halt_x
mail_x
operator_x
内置变量的用法
常见内置变量
(awk专属小变量)
- FS :指定每行文本的字段分隔符,缺省为空格或制表位。与 “-F”作用相同 -v “FS=:”
- OFS:输入字段的分割符(默认是空格)
- NF:当前处理的行的字段个数(列)
- NR:当前处理的行的行号(序数)
- FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)
- ORS:输出行的分割符,默认为换行符
- $0:当前处理的行的整行内容
- $n:当前处理行的第n个字段(第n列)
- FILENAME:被处理的文件名
- RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
打印出包含root的行
[root@yzq mnt]# awk -F: '/root/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
在 ‘//{}’ 中//之间输入需要打印的匹配条件,这里可以使用正则
awk ‘{print NF}’ 打印每一行列数
awk ‘{print NR}’ 显示行号
awk ‘NR2{print}’
awk ‘NR2’ 打印第二行,不加print也一样,默认就是打印
awk ‘NR2{print $1}’ 打印第二行第一列
awk ‘{print $NF}’ 打印最后一列
awk -F: ‘{print $(NF-1)}’ 倒数第二行
awk ‘END{print NR}’ 打印总行数
awk ‘NR1,NR3{print}’ passwd 打印出1到3 行
awk ‘NR1||NR==3{print}’ passwd 打印出1和3行
awk ‘END{print $0}’ 打印文件最后一行
awk ‘BEGIN{xx;print xx}’ 可计算
awk ‘$1~/ro/’ 模糊匹配,只要有ro就匹配;!~表示不包含
打印出本机IP地址
[root@yzq ~]#ifconfig ens33 | awk '/netmask/{print "本机的IP地址是"$2}'
本机的IP地址是192.168.28.10
[root@yzq mnt]#ifconfig ens33 | awk 'NR==2{print $2}'
192.168.28.10
实例
提取下面的字段中的 IP 地址和时间
[root@yzq mnt]#cat 3.txt
58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"""sendfileo
[root@yzq mnt]#cat 3.txt | awk -F"[ []+" '{print $1" "$4}'
58.87.87.99 09/Jun/2020:03:42:43
128.14.209.154 09/Jun/2020:03:42:43
64.90.40.100 09/Jun/2020:03:43:11
提取host.txt主机名后再放回host.txt文件
[root@yzq mnt]#cat txt
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
[root@yzq mnt]#cat 2.txt | awk -F. '{print $2}' >> 2.txt
[root@yzq mnt]#cat 2.txt
1 www.baidu.com
2 www.google.com
3 www.jd.com
4 www.tmall.com
5 www.taobao.com
baidu
google
jd
tmall
taobao
统计/etc/fstab文件中每个文件系统类型出现的次数
[root@yzq mnt]#cat /etc/fstab | egrep -v '#|^$' | awk '{print $3}' | sort | uniq -c
1 swap
2 xfs
提取版本号
[root@yzq mnt]#cat test
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
使用grep
[root@yzq mnt]#cat test | grep -Eo '([0-9]+\.)+[0-9]+'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5
统计/etc/fstab文件中每个单词出现的次数
\b[[:alpha:]]+\b 以单词开头和结尾的
[[:alpha:]] 代表英文字母:a-z,A-Z
[root@yzq mnt]#cat /etc/fstab | grep -Eo '\b[[:alpha:]]+\b' | sort | uniq | wc -l
35
提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
[root@yzq mnt]#cat btxt | grep -Eo '[0-9]'
0
5
9
7
3
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76551.html