第十四章 Linux系统三剑客-awk详解

一、含义

awk命令来自于三位创始人”Alfred Aho,Peter Weinberger, Brian Kernighan “的姓氏缩写,其功能是用于对文本和数据进行处理的编程语言。使用awk命令可以让用户自定义函数或正则表达式对文本内容进行高效管理,与sed、grep并称为Linux系统中的文本三剑客。

语法格式:awk 参数 文件

二、常用参数

-F 指定输入时用到的字段分隔符
-v 自定义变量
-f 从脚本中读取awk命令
-m 对val值设置内在限制

三、内置变量

变量名称 说明
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数,最后一列
NR 已读的记录数,行号
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 完整的一行内容
$n n 是数字 表示取出第几列 多列用逗号分割
$NF 显示最后一列的内容

四、常用过滤操作

1.仅显示指定文件中含有指定关键词root的内容

[root@jindada ~]# awk  '/root/'   passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2.仅显示指定文件中含有指定关键词root和adm的内容

[root@jindada ~]# awk  '/root/;/adm/'   passwd 
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

3.仅显示指定文件中含有指定关键词root或adm的内容

[root@jindada ~]# awk  '/root|adm/'   passwd 
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

4.显示指定文件中指定关键词adm到mail的内容

[root@jindada ~]# awk  '/adm/,/mail/'   passwd 
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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

5.显示指定文件指定多少行的内容

# 显示指定文件指定第一行的内容
[root@jindada ~]# awk  'NR==1'  passwd 
root:x:0:0:root:/root:/bin/bash

# 显示指定文件指定第一行到第三行的内容
[root@jindada ~]# awk  'NR==1,NR==3'  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@jindada ~]# awk  'NR==1;NR==3'  passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# 显示指定文件指定大于10行的内容
[root@jindada ~]# awk  'NR>10'  passwd 
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
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

# 显示指定文件指定小于10行的内容
[root@jindada ~]# awk  'NR<10'  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
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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

# 显示指定文件指定小于等于2行的内容
[root@jindada ~]# awk  'NR<=2'  passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

# 显示指定文件指定大于等于15行的内容
[root@jindada ~]# awk  'NR>=15'  passwd 
dbus:x:81:81:System message bus:/:/sbin/nologin
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

# 显示指定文件指定大于10行小于16行的内容
[root@jindada ~]# awk  'NR>10 && NR<16'  passwd 
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

# 显示指定文件指定大于15行,小于3行的内容
[root@jindada ~]# awk  'NR<3 || NR>15'   passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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

6.打印整个文件内容

[root@jindada ~]# awk  '{print  $0}'   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
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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
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

7.给文件内容加上行号

[root@jindada ~]# awk  '{print NR,$0}'   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
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin

五、常规取反操作

1.显示指定文件不包含sbin的内容

[root@jindada ~]# awk  '!/sbin/'  passwd 
root:x:0:0:root:/root:/bin/bash

2.显示指定文件不是第一行的内容

[root@jindada ~]# awk  'NR!=1'  passwd 
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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
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

3.显示指定文件不是第5行到第15行的内容

[root@jindada ~]# awk  'NR<5 || NR >15'  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
adm:x:3:4:adm:/var/adm:/sbin/nologin
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

六、常规取列操作

1.显示指定文件指定以:为分隔符打印出第一列的内容

[root@jindada ~]# awk  -F:  '{print $1}'  passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix

2.显示指定文件指定以:为分隔符打印出第一、二列的内容

[root@jindada ~]# awk  -F:  '{print $1,$2}'  passwd 
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
games x
ftp x
nobody x
systemd-network x
dbus x
polkitd x
sshd x
postfix x

3.显示指定文件指定以:为分隔符打印出最后一列的内容

[root@jindada ~]# awk  -F:  '{print $NF}'  passwd 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin

4.显示指定文件指定以:为分隔符打印出倒数第二列的内容

$(NF-1)   倒数第二列 
[root@jindada ~]# awk  -F:  '{print $(NF-1)}'  passwd 
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/root
/usr/games
/var/ftp
/
/
/
/
/var/empty/sshd
/var/spool/postfix

5.显示指定文件指定以:为分隔符打印出第一列的内容

[root@jindada ~]# awk  -F '[:]'  '{print $1}'  passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix

七、常规取服务器IP地址

1.ifconfig

[root@jindada ~]# ifconfig   eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.100  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::3310:9d15:9ee4:43e8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:eb:ea:8d  txqueuelen 1000  (Ethernet)
        RX packets 15508  bytes 1698801 (1.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10471  bytes 1145384 (1.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@jindada ~]# ifconfig   eth0 | awk  'NR==2'  
        inet 10.0.0.100  netmask 255.255.255.0  broadcast 10.0.0.255
[root@jindada ~]# ifconfig   eth0 | awk  'NR==2'   | awk  '{print  $2}'
10.0.0.100
[root@jindada ~]# ifconfig   eth0 | awk  'NR==2{print  $2}'
10.0.0.100

2.ip

[root@jindada ~]# ip  a  s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:eb:ea:8d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::3310:9d15:9ee4:43e8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@jindada ~]# ip  a  s eth0 | awk  'NR==3'
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@jindada ~]# ip  a  s eth0 | awk  'NR==3' | awk  -F '[ /]'  '{print $6}'
10.0.0.100
[root@jindada ~]# ip  a  s eth0 | awk  'NR==3' | awk  -F '[ /]*'  '{print $3}'
10.0.0.100
[root@jindada ~]# echo "    //   inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0" >ip.txt
[root@jindada ~]# cat ip.txt
    //   inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@jindada ~]# awk  -F '[ /]'  '{print $11}' ip.txt 
10.0.0.100
[root@jindada ~]# awk  -F '[ /]*'  '{print $3}' ip.txt 
10.0.0.100

八、常规取值添加分隔符

1.显示指定文件指定以:为分隔符打印出第一列和第二列的内容并以:为分隔符

[root@jindada ~]# awk  -F:  '{print $1":"$2}'  passwd 
root:x
bin:x
daemon:x
adm:x
lp:x
sync:x
shutdown:x
halt:x
mail:x
operator:x
games:x
ftp:x
nobody:x
systemd-network:x
dbus:x
polkitd:x
sshd:x
postfix:x

2.显示指定文件指定以:为分隔符打印出所有列内容并以:为分隔符

[root@jindada ~]# awk  -F:  '{print  $NF":"$2":"$3":"$4":"$5":"$6":"$1}'  passwd 
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:11:0:operator:/root:operator
/sbin/nologin:x:12:100:games:/usr/games:games
/sbin/nologin:x:14:50:FTP User:/var/ftp:ftp
/sbin/nologin:x:99:99:Nobody:/:nobody
/sbin/nologin:x:192:192:systemd Network Management:/:systemd-network
/sbin/nologin:x:81:81:System message bus:/:dbus
/sbin/nologin:x:999:998:User for polkitd:/:polkitd
/sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
/sbin/nologin:x:89:89::/var/spool/postfix:postfix

九、常规排除空行

 [root@jindada ~]# grep -v '^$'  sshd_config 
 
 [root@jindada ~]# sed '/^$/d' sshd_config 
 
 [root@jindada ~]# awk '!/^$/' sshd_config 
posted @ 2020-07-14 20:59  年少纵马且长歌  阅读(228)  评论(0编辑  收藏  举报