文本处理工具AWK简单用法案例
Posted 初如
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理工具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=":" 'BEGINRS="[ ]+"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 'BEGINFIELDWIDTHS="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 'BEGINFIELDWIDTHS="2 3:2 2"print $1,$2,$3,$4' f.test
AD DA AA
*号必须放在最后而且只能单独使用
[root@centos880 ~]# awk 'BEGINFIELDWIDTHS="2 3:2"print $1,$2,NF ' f.test
AD DA 2 字段数NF=2
[root@centos880 ~]# awk 'BEGINFIELDWIDTHS="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的行 打印出来
``
以上是关于文本处理工具AWK简单用法案例的主要内容,如果未能解决你的问题,请参考以下文章