文本处理工具AWK简单用法案例

AWK

文本处理
输出格式化的文本报表
执行算数运算
执行字符串操作

常用参数:
-F	指定输入时用到的字段分隔符 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v	自定义变量
-f	从脚本中读取awk命令
-m	对val值设置内在限制
查看当前linux的awk版本
[19:29:08 root@centos880 ~]# which awk
/usr/bin/awk
[19:29:18 root@centos880 ~]# ll /usr/bin/awk 
lrwxrwxrwx. 1 root root 4 May 11  2019 /usr/bin/awk -> gawk

使用awk时需要用print打印 $0表示字段
用:分隔符 取passwd 文件中的第一列和第三列的前三行;$1,$3分割开打印,默认是空白字符
[20:35:52 root@centos880 awkdir]# awk -F":" '{print $1,$3}' /etc/passwd | head -n3
root 0
bin 1
daemon 2

awk支持正则表达式 取ip
[19:52:23 root@centos880 ~]# ifconfig eth0 | awk '/.*inet/{print $2}'
10.0.0.80

[19:57:23 root@centos880 ~]# ip a show eth0 | awk -F"[ /]+" '/.*inet/{print $3}'
10.0.0.80

自定义分隔符 -v FS="分割符" 等同 -F"分隔符"
-v FS和-F 一个记录内的字段分隔符 默认为空白符
特殊,当FS为默认情况,FS为单个空白符的时候将以连续的空白(空格,换行)作为字段分隔符
[20:16:24 root@centos880 awkdir]# awk -v FS=":" '{print $1,$3}' /etc/passwd | head -n3
root 0
bin 1
daemon 2
上效果与 awk -F":" '{print $1,$3}' /etc/passwd | head -n3 效果相同

-v FS=分隔符 和-F同时使用时会冲突 -F优先级高于 -v FS 如下:
[20:35:35 root@centos880 awkdir]# cat test 
a:b:c:d:e:f;g;h;i
[20:33:38 root@centos880 awkdir]# awk -v FS=":" -F";" '{print $1,$3}' test > a.test 
[20:34:56 root@centos880 awkdir]# cat a.test 
a:b:c:d:e:f h
[20:35:10 root@centos880 awkdir]# awk -v FS=";" -F":" '{print $1,$3}' test > b.test 
[20:35:29 root@centos880 awkdir]# cat a.test b.test 
a:b:c:d:e:f h
a c

OFS:输出字段分割符 默认为空白字符
[20:51:01 root@centos880 awkdir]# awk -F":" -v OFS="#" '{print $1,$3}' /etc/passwd | head -n3
root#0
bin#1
daemon#2


awk -v ORS="===" -v FS=":" 'BEGIN{RS="[ ]+"}{print $1"!"$2}' /etc/passwd
root!x===User!/var/ftp===Overflow!===User!/===message!===bus!/===Core!===
Dumper!/===Resolver!/===used!===by!===the!===trousers!===package!===to!===
sandbox!===the!===tcsd!===daemon!/dev/null===for!===polkitd!/===DNS!===
resolver!/etc/unbound===for!===sssd!/===SSH!/var/empty/sshd===user!/run/saslauthd===

RS没设置变量之前 默认为一个换行符 所以一般情况下一行就是一条记录
RS 记录输入分隔符 RS 通常设置在BEGIN代码块中 因为要在优先读取文件之前 确定记录输入分隔符
RS如设置为空即为多个换行符
ORS 记录输出分隔符
FS -F 一个记录内的字段分隔符
NR 多文件记录计数
FNR 单个文件的计数
NF 一个记录内的字段计数
awk -F: ‘{print NF}’ /etc/passwd NF 一个记录内的字段数量

NR和FNR

NR 多文件记录计数 遇到多个文件 会统计所有文件的记录计数
FNR 单个文件的计数 遇到多个文件 会统计每个文件的记录计数
[root@centos880 ~]# cat a.txt 
1000 北京市
1100 天津市
1210 河南省
1310 福建省
[root@centos880 ~]# awk '{print NR}' a.txt a.txt 
1
2
3
4
5
6
7
8
[root@centos880 ~]# awk '{print FNR}' a.txt a.txt 
1
2
3
4
1
2
3
4

分割记录字段(gawk的高级功能扩展)
FIELDWIDTHS
指定预定义变量FIELDWIDTHS按字符宽度分割字段

[root@centos880 ~]# cat f.test
ADDSADAAAADDDSD
[root@centos880 ~]# awk 'BEGIN{FIELDWIDTHS="2 3:2 2 *"}{print $1,$2,$3,$4}' f.test
AD DA AA ADDDSD
第一个字段 打印2个字节 
第二个字段 3:2 跳过3个字节再打印2个字节
~
第四个字段 * 打印后面所有的字节

例如: FIELDWIDTHS="2 3:2 2" 1字段2个字节 2字段跳过3个字节后的2个字节 3字段2个字节 没匹配的字节全部丢弃
[root@centos880 ~]# awk 'BEGIN{FIELDWIDTHS="2 3:2 2"}{print $1,$2,$3,$4}' f.test 
AD DA AA 
*号必须放在最后而且只能单独使用

[root@centos880 ~]# awk 'BEGIN{FIELDWIDTHS="2 3:2"}{print $1,$2,NF }' f.test 
AD DA 2 字段数NF=2

[root@centos880 ~]# awk 'BEGIN{FIELDWIDTHS="2 2 15 * "}{print $1,$2,$3,$4,NF }' f.test 
AD DS ADAAAADDDSD  3 第三个字段取到能取到的所有字节 字段数为3   而定义的$4字段因无字节可取而无用

awk数据筛选

在不定义RS情况下默认一条记录为一行
行号筛选
awk 'NR=2' test 筛选出test文件的第二行
awk 'NR>=3' test 筛选出3到之后的所有行

正则筛选
awk '/net/' test
df | awk '/^\/dev.*boot$/' 筛选出行首/dev 行尾是boot结尾的行 
/dev/sda1         999320  105656    824852  12% /boot

多重条件筛选
awk -F: '$3<100 && $7 ~ /shutdown/ {print $0}' /etc/passwd   以:作为字段分隔符 第三个字段小于100 短路与第7个字段中包含shutdown的行 打印出来
``
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值