您的位置:首页 > 运维架构 > Linux

linux 三剑客之 awk

2016-07-04 13:56 246 查看
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..默认还是以空格键为分隔的,所以虽然我们定义了 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}'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 三剑客