awk命令实战

命令介绍

awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

使用方法 :
awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。


选项:

-F #指定分隔符,它默认是以空白字符为分隔符

内置选项:

    NR      #表示行号
    NF      #表示每一行中的列数
    $NF     #表示最后一列
    $n      #n为数字,表示某一列
    OSF     #指定输出内容的分隔符
    &&      #逻辑与,并且
    ||      #逻辑或,或者
    !       #非,去反
    ,       #取出连续的行、列
    ;       #取出不连续的行、列

实战:

#取行
[root@whb ~]# awk 'NR==1' /etc/passwd       #取出passwd的第一行
root:x:0:0:root:/root:/bin/bash
[root@whb ~]# awk 'NR==1,NR==3' /etc/passwd     #取出passwd的第一行到第三行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@whb ~]# awk 'NR==1;NR==3' /etc/passwd      #取出passwd的第一行和第三行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@whb ~]# awk 'NR<3' /etc/passwd        #取出小于第三行的行
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@whb ~]# awk 'NR>15' /etc/passwd       #取出大于第15行的行
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
test:x:1000:1000::/home/test:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
[root@whb ~]# awk 'NR>=20' /etc/passwd      #大于等于
named:x:25:25:Named:/var/named:/sbin/nologin

[root@whb ~]# awk 'NR>15 && NR<20' /etc/passwd      #取出大于15小于20的行
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
test:x:1000:1000::/home/test:/bin/bash
[root@whb ~]# awk 'NR<5 || NR>20' /etc/passwd      #取出大于20或小鱼5的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@whb ~]# awk '{ print NR,$0 }' /etc/passwd      #显示行号
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

#取列
[root@whb ~]# awk -F':' '{ print $NF }' /etc/passwd    #以:为分隔符,取出每行最后一列
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
[root@whb ~]# awk -F':' '{ print $(NF-1) }' /etc/passwd      #取出倒数第2列
/root
/bin
/sbin
/var/adm
/var/spool/lpd 
[root@whb ~]# awk -F':' '{ print $5 }' /etc/passwd       #取出第五列
root
bin
daemon
adm
lp
[root@whb ~]# awk -F':' 'NR==5{ print $6 }' /etc/passwd      #取出第五行的第二列
/var/spool/lpd

#过滤
[root@whb ~]# awk '/root/' /etc/passwd      #过滤出包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@whb ~]# awk -F':' '/root/{ print $NF }' /etc/passwd       #过滤出含root行的最后一列
/bin/bash
/sbin/nologin
[root@whb ~]# awk '/^root/' /etc/passwd        #过滤出root开头的行
root:x:0:0:root:/root:/bin/bash
[root@whb ~]# awk '/root|adm/' /etc/passwd       #过滤出含有root或admin的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@whb ~]# awk '/^root/,/^adm/' /etc/passwd     #过滤出root开头到adm开头的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@whb ~]# awk '/^root/;/^adm/' /etc/passwd      #过滤出root开头或adm开头的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@whb ~]# awk '!/^root/' /etc/passwd    #过滤出不包含root开头的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

#取出ip地址
[root@whb ~]# ifconfig eth0 | awk -F' ' 'NR==2{ print $2  }'
10.0.0.100

[root@whb ~]# ip a s eth0 | awk -F'[ /]*' 'NR==3{ print $3 }' 
10.0.0.100

点赞

发表回复