awk 用法:
awk -F 参数用法:指定分隔符
我的源文档:
more domain.log
http://www.baidu.com/index.html
http://www.google.com/1.html
http://www.baidu.com/1.html
[root@mysql ~]# awk -F "/" '{print $3}' domain.log
www.baidu.com
www.google.com
www.baidu.com[root@mysql ~]# awk -F "/" '{print $1}' domain.log
http:
http:
http:
[root@mysql ~]# awk -F "/" '{print $2}' domain.log
[root@mysql ~]# awk -F "/" '{print $4}' domain.log
index.html
1.html
1.html
[root@mysql ~]# awk -F "//" '{print $4}' domain.log
[root@mysql ~]# awk -F "//" '{print $2}' domain.log
www.baidu.com/index.html
www.google.com/1.html
www.baidu.com/1.html
[root@mysql ~]# awk -F "//" '{print $2}' domain.log |sort |uniq -c|sort -rn
2 www.baidu.com/index.html
1 www.google.com/1.html
1 www.baidu.com/1.html
ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print $4}'
ifconfig eth1 显示网卡1的信息
awk -F'[ :]+' 截取以空格或者冒号为分隔符出现1次或多次
NR==2显示第二行
print $2 显示第二列
print $NF 最后一列
awk 指定多个分隔符
awk -F"[|%]" '{}' 这种形式指定的分隔符是或的关系,即以“|”或“%”为分隔符;
awk -F"[|][%]" '{}' 这种形式指定的分隔符是合并的关系,即以“|%”作为一个字符为分隔符。
具有典型意义
[root@mysql ~]# more a.txt
1 : inet addr:10.0.0.102 Bcast:10.0.0.255 Mask:255.255.255.0
1: : 8 :::::::::::::::: 12: ::::: ::::2
要打印IP地址段
[root@mysql ~]# awk -F'[ :]+' 'NR==1 {print $4}' a.txt
10.0.0.102
[root@mysql ~]#
ifconfig eth1 | grep "inet6"|awk '{print $3}'|awk -F "/" '{print $1}'
awk 处理行 如下打印3-4行的内容
awk "NR>2 && NR<5" 2.txt
[root@localhost cy]# awk -F "[ :]+" '{print $7,$5,$3}' 3.txt
255.255.240.0 172.17.15.255 172.17.0.17
[root@localhost cy]# awk 'NR==1{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost cy]#
[root@localhost ~]# ifconfig eth0| grep "Bc"|awk -F ":" '{print $2}'|awk '{print $1}'
172.17.0.17
[root@localhost ~]#
awk是一种可以处理数据、产生格式化报表的语言。它的工作方式是读取数据,将每一行数据视为一条记录,每笔记录以字段分隔符分成若干字段,然后输出各个字段的值。
awk对每一条记录,都会套用一个"样式{操作}",如果该行符合样式,就执行指定的操作。
样式或操作之一可以省略。如果只有样式,表示要显示符合样式的行;如果只有操作,表示对每一行数据都执行该项操作。
awk的常用的作用格式:
awk "样式" 文件:把符合样式的数据行显示出来。
awk ‘{操作}’ 文件:对每一行都执行{}中的操作。
awk ‘样式{操作}’对符合样式的数据行,执行{}中的操作。
awk的几种用法:
1、awk '/root/' file
显示file中root的行
2、awk '{print $1,$2}' file ","可以省略如果让两个字符以空格隔开的话用 awk '{print $1 "\t" $2'
显示file中每一行的第1个和第2个字段(默认以空格为分隔符)
3、awk '/ab/{print $1,$2}' file
显示file中有ab的行的第1个和第2个字段(以空格为分隔符)
4、awk -F: '/^root/{print $2,$3}' file
以":"为分隔符,把以root开头的行中的第2个和第3个字符显示出来。
5、awk -F: 'BEGIN{OFS="++++"}/^root/{print $1,$2,$3}' /etc/passwd
把passwd中,以":"为分隔符找出首行为root的行,并显示前3个字段,并且字段之间以+++隔开
实例:
变量名称代表意义
NF每一行$0拥有的字段总数(默认以空格或Tab为分隔符)
NR目前awk所处理的是第几行数据
FS目前的分隔符,默认是空格键
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@centos ~]
# cat 1
a2a3a4a5a
b2b3b4b5b
c2c3c4c5c
[root@centos ~]
# cat 1|awk '{print $1 "\t 行:" NR "\t 该行总字段:" NF}'
a 行:1 该行总字段:5
b 行:2 该行总字段:5
c 行:3 该行总字段:5
查阅
passwd
第三栏数据小于10的数据的行,并且仅列出账号和第三栏。
cat
/etc/passwd
|
awk
'{FS=":"}$3<10 {print $1 "\t" $3}'
root:x:0:0:root:
/root
:
/bin/bash
bin1
daemon2
...
mail8
|
上边第一行会全部显示出来,这是因为我们读入第一行的时候,那些变数 $1, $2..默认还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始生效。
那么怎么办呢?我们可以预先设定 awk 的变量啊! 利用 BEGIN 这个关键词!这样做:cat /etc/passwd|awk 'BEGIN{FS=":"}$3<10 {print $1 "\t" $3}'
显示ip地址
ifconfig |grep 'inet addr'|grep Bcast|awk '{print $2}'|awk -F: '{print $2}'
显示网络名称
cat /proc/net/dev |awk -F: '/eth.:|sit.:|wlan.:|ppp.:/{print $1}'