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}'