Linux命令-awk

一.awk是什么

AWK从放弃到入门:http://www.zsythink.net/archives/tag/awk
awk是一个报告生成器,它拥有强大的文本格式化的能力,以行为单位处理文本。
基本语法:

awk [options] 'Pattern{Action}' file

三要素:变量及选项、匹配模式、动作

二.变量及选项

1.NF、NR、FNR

$0:表示整行
$1:表示第一个字段,以此类推
NR:行号
NF:每行的字段数,故$NF表示一行中最后一个字段
FNR:处理多个文件时,分别显示各自的行号

[root@localhost ~]# cat test 
aa bb cc
11 22 33 44
[root@localhost ~]# cat test | awk '{print NR,NF,$NF}'
1 3 cc
2 4 44
2.FS、OFS

FS:输入字段分隔符, 默认为空白符
OFS:输出字段分隔符, 默认为空白符
设置字段分隔符:-F “:”

[root@localhost ~]# cat test 
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk -v FS=":" -v OFS="#" '{print $1,$2}'
aa#bb
11#22
3.RS、ORS

RS:指定输入时的换行符
ORS:指定输出时的换行符

阿斯蒂芬
[root@localhost ~]# cat test 
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk -v RS=":" '{print NR,$0}'
1 aa
2 bb
3 cc
11
4 22
5 33
6 44

[root@localhost ~]# cat test | awk -v RS=":" -v ORS="@" '{print NR,$0}'
1 aa@2 bb@3 cc
11@4 22@5 33@6 44
4.ARGC、ARGV

FILENAME:文件名
ARGC:参数的个数,包括awk命令本身
ARGV:保存参数的数组

[root@localhost ~]# awk '{print FILENAME,ARGV[0],ARGV[1],ARGV[2],ARGC,$0}' test test1
test awk test test1 3 aa:bb:cc
test awk test test1 3 11:22:33:44
test1 awk test test1 3 aa bb cc
test1 awk test test1 3 11 22 33 44
5.自定义变量
[root@localhost ~]# awk -v str="hello,world" 'BEGIN{print str}'
hello,world
[root@localhost ~]# awk 'BEGIN{str="hello,world";print str}'
hello,world

三.匹配模式

1.BEGIN/END模式

语法:awk ‘BEGIN{action} {action} END{action}’ file
BENGIN:表示在处理文本之前要执行的动作
END:表示在处理完文本之后要执行的动作

[root@localhost ~]# cat test
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk 'BEGIN{print "hello"} {print $0} END{print "world"}'
hello
aa:bb:cc
11:22:33:44
world
2.正则匹配模式

语法:awk ‘/正则/ {action}’ file

[root@node1 ~]# awk '/^p/ {print $1}' /etc/passwd
polkitd:x:999:998:User
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

若正则表达式中包含/,则需转义

[root@node1 ~]# awk '/\/bin\/bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
liwen:x:1001:1001::/home/liwen:/bin/bash

使用扩展正则表达式,添加选项–posix或–re-interval,似乎没必要

[root@node1 ~]# cat text 
hey
heey
heeey
heeeey
[root@node1 ~]# awk '/he{2,3}y/ {print $0}' text 
heey
heeey
[root@node1 ~]# awk --posix '/he{2,3}y/ {print $0}' text 
heey
heeey
[root@node1 ~]# awk --re-interval '/he{2,3}y/ {print $0}' text 
heey
heeey
3.行范围模式

语法:awk ‘/正则1/,/正则2/ {action}’ file
解释:设正则1第一次匹配的行为m,正则2第一次匹配行n,则表示m-n之间的行

4.关系表达式模式

在这里插入图片描述

获取IP地址:
[root@node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:91:29:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.77/24 brd 192.168.5.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::1358:f897:63a7:a220/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@node1 ~]# ip a|awk 'NR==9 {print $2}'
192.168.5.77/24

四.动作

1.printf格式化输出
[root@localhost ~]# awk -v FS=":" 'BEGIN{printf "%-10s\t %s\n", "用户名称", "用户ID"} {printf "%-10s\t %s\n", $1, $3}' /etc/passwd
	用户名称      	 用户ID
	root      	 0
	bin       	 1
	daemon    	 2
	adm       	 3
2.条件控制

直通车:http://www.zsythink.net/archives/2046
在这里插入图片描述
在这里插入图片描述

3.循环

直通车:http://www.zsythink.net/archives/2062

五.例

1.awk数组

直通车:http://www.zsythink.net/archives/2093
awk数组妙用,统计次数
在这里插入图片描述
在这里插入图片描述

2.内置函数

直通车:http://www.zsythink.net/archives/2113

3.三元运算、打印奇偶行

直通车:http://www.zsythink.net/archives/2159
打印奇偶行:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值