Shell脚本三剑客之awk

导读:本篇文章讲解 Shell脚本三剑客之awk,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


awk

概述

awk是一种处理文本文件的语言,是一个强大的文本分析工具。
专门为文本处理设计的编程语言,是行处理软件,通常用于扫描、过滤、统计等。
数据来自标准输入或管道。

工作原理

逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

Awk基本语法

命令格式

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2awk -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 ‘NR
2’ 打印第二行,不加print也一样,默认就是打印
awk ‘NR2{print $1}’ 打印第二行第一列
awk ‘{print $NF}’ 打印最后一列
awk -F: ‘{print $(NF-1)}’ 倒数第二行
awk ‘END{print NR}’ 打印总行数
awk ‘NR
1,NR3{print}’ passwd 打印出1到3 行
awk ‘NR
1||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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!