awk命令总结

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

基本格式

awk [参数] [处理内容] [操作对象]

参数详情

-F 设置分隔符

print 打印

NF 统计以分隔符分开的字段有多少个(变量)

$ 取值

awk运行处理规则的执行流程

  1. BEGIN{}:表示在开始匹配之前执行一次,通常用于初始化一些变量或设置一些条件。
  2. //:表示正则表达式的开始和结束标志,用于包裹整个正则表达式。
  3. {}:表示一个捕获组,用于从匹配结果中提取出需要的信息。
  4. END{}:表示在匹配结束后执行一次,通常用于对匹配结果进行一些处理或输出。

这些元素可以组合使用,也可以单独使用,最少有一个,最多有四个。

查看/etc/passwd 的第一列内容

使用-F 设置分割符为冒号(:) 

使用print $1 设置为输出第一行的第一个字段 

/etc/passwd  指定文件 

[root@LDP ~]# awk -F':'  '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-coredump
dbus
tss
sssd
chrony
sshd
systemd-oom
dhcpd

使用默认的分隔符 (空格)

显示不出来

[root@LDP ~]# awk '{print $1}' /etc/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
nobody:x:65534:65534:Kernel
systemd-coredump:x:999:997:systemd
dbus:x:81:81:System
tss:x:59:59:Account
sssd:x:998:996:User
chrony:x:997:995:chrony
sshd:x:74:74:Privilege-separated
systemd-oom:x:993:993:systemd
dhcpd:x:177:177:DHCP

统计每一行的字段数量

也是使用-F作为分隔符,NF统计字段数量

[root@LDP ~]# awk -F ':' '{ print  NF}'  /etc/passwd
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7

输出第三个和单倒数第一个字段

这里就是使用NF变量,在这里就是使出该文件的最后的一个字段

[root@LDP ~]# awk -F ':' '{print $3 $(NF)}' /etc/passwd
0/bin/bash
1/sbin/nologin
2/sbin/nologin
3/sbin/nologin
4/sbin/nologin
5/bin/sync
6/sbin/shutdown
7/sbin/halt
8/sbin/nologin
11/sbin/nologin
12/sbin/nologin
14/sbin/nologin
65534/sbin/nologin
999/sbin/nologin
81/sbin/nologin
59/sbin/nologin
998/sbin/nologin
997/sbin/nologin
74/usr/sbin/nologin
993/usr/sbin/nologin
177/sbin/nologin

输出第三个和单倒数第二个字段

这里的$(NF-1) 就是代表倒数第二,因为NF是统计每一行的字段有多少,-1就是代表倒数第二

[root@LDP ~]# awk -F ':' '{print $3 $(NF-1)}' /etc/passwd
0/root
1/bin
2/sbin
3/var/adm
4/var/spool/lpd
5/sbin
6/sbin
7/sbin
8/var/spool/mail
11/root
12/usr/games
14/var/ftp
65534/
999/
81/
59/
998/
997/var/lib/chrony
74/usr/share/empty.sshd
993/
177/

使用逗号分隔(,)

在条件print $3 和$(NF-1)中间加上逗号就是将输出的内容使用空格分开,方便查看

[root@LDP ~]# awk -F ':' '{print $3 ,$(NF-1)}' /etc/passwd
0 /root
1 /bin
2 /sbin
3 /var/adm
4 /var/spool/lpd
5 /sbin
6 /sbin
7 /sbin
8 /var/spool/mail
11 /root
12 /usr/games
14 /var/ftp
65534 /
999 /
81 /
59 /
998 /
997 /var/lib/chrony
74 /usr/share/empty.sshd
993 /
177 /

输出行号

变量NR表示当前输出行号

[root@LDP ~]# awk -F ':' '{print NR ") " $1}' /etc/passwd
1) root
2) bin
3) daemon
4) adm
5) lp
6) sync
7) shutdown
8) halt
9) mail
10) operator
11) games
12) ftp
13) nobody
14) systemd-coredump
15) dbus
16) tss
17) sssd
18) chrony
19) sshd
20) systemd-oom
21) dhcpd

将输出的内容编号

使用NR 编号 并添加花括号

花括号后面的空格为编号和花括号 和输出内容的间距,$1 代表针对第一行内容进行操作。

[root@LDP ~]# awk  -F ':' '{print NR "}  " $1 }' /etc/passwd
1}  root
2}  bin
3}  daemon
4}  adm
5}  lp
6}  sync
7}  shutdown
8}  halt
9}  mail
10}  operator
11}  games
12}  ftp
13}  nobody
14}  systemd-coredump
15}  dbus
16}  tss
17}  sssd
18}  chrony
19}  sshd
20}  systemd-oom
21}  dhcpd

查找关键字

具体查找的内容为 /usr

print $0 将查找出来的行,全部显示出来

[root@LDP ~]# awk -F ':' '/usr/ {print $0}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin

只打印第一个字段的内容

[root@LDP ~]# awk -F ':' '/usr/   {print $1}' /etc/passwd
games
sshd
systemd-oom

匹配root开头的行

[root@LDP ~]# awk -F ":" ' /^root/  {print $0 }' /etc/passwd
root:x:0:0:root:/root:/bin/bash

打印最后一行为/bash/结尾的行

这里就是使用NF便用变量(NF代表这一行的字段数量),查找以/bash结尾的行

~ 表示包含

[root@LDP ~]# awk -F ':' '$NF ~ /bash/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

打印最后一行不为/bash结尾的行

!~  表示不包含

[root@LDP ~]# awk -F ":" '$NF !~ /bash/{print $0}' /etc/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

输出指定行数后面的行

这里就是输出第一行之后的行,并只打印第一个字段。

[root@LDP ~]# awk -F ':' 'NR >1 {print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-coredump
dbus
tss
sssd
chrony
sshd
systemd-oom
dhcpd


查找内容多个内容

查找内容,以root halt ftp 开头的行,并只显示该行的第一个字段

[root@LDP ~]# awk -F ':' '$1 == "root" || $1 == "halt" || $1 == "ftp" {print $1}' /etc/passwd
root
halt
ftp

显示行号

NR"}  "   花括号后面的空格可以自己调节。

[root@LDP ~]# awk -F ':' '$1 == "root" || $1 == "halt" || $1 == "ftp" {print NR"}  " $1 }' /etc/passwd
1}  root
8}  halt
12}  ftp

指定分隔符的方式(BEGIN)

print 打印多个字符需要使用逗号(,)分隔

[root@LDP ~]# awk 'BEGIN{ FS=":"} {print $NF,$2}' /etc/passwd
/bin/bash x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/bin/sync x
/sbin/shutdown x
/sbin/halt x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/usr/sbin/nologin x
/usr/sbin/nologin x
/sbin/nologin x

将输出的内容中间添加分割符

OFS    : 指定打印分隔符(默认空格),就是将查找出来的多个字段,使用OFS指定的分隔符插入到两个字段中间,方便查看。

[root@LDP ~]# awk -F ":"  'BEGIN{OFS="  "}{print $NF, $1}' /etc/passwd
/bin/bash  root
/sbin/nologin  bin
/sbin/nologin  daemon
/sbin/nologin  adm
/sbin/nologin  lp
/bin/sync  sync
/sbin/shutdown  shutdown
/sbin/halt  halt
/sbin/nologin  mail
/sbin/nologin  operator
/sbin/nologin  games
/sbin/nologin  ftp
/sbin/nologin  nobody
/sbin/nologin  systemd-coredump
/sbin/nologin  dbus
/sbin/nologin  tss
/sbin/nologin  sssd
/sbin/nologin  chrony
/usr/sbin/nologin  sshd
/usr/sbin/nologin  systemd-oom
/sbin/nologin  dhcpd
[root@LDP ~]# awk -F ":"  'BEGIN{OFS=" {}{} "}{print $NF, $1}' /etc/passwd
/bin/bash {}{} root
/sbin/nologin {}{} bin
/sbin/nologin {}{} daemon
/sbin/nologin {}{} adm
/sbin/nologin {}{} lp
/bin/sync {}{} sync
/sbin/shutdown {}{} shutdown
/sbin/halt {}{} halt
/sbin/nologin {}{} mail
/sbin/nologin {}{} operator
/sbin/nologin {}{} games
/sbin/nologin {}{} ftp
/sbin/nologin {}{} nobody
/sbin/nologin {}{} systemd-coredump
/sbin/nologin {}{} dbus
/sbin/nologin {}{} tss
/sbin/nologin {}{} sssd
/sbin/nologin {}{} chrony
/usr/sbin/nologin {}{} sshd
/usr/sbin/nologin {}{} systemd-oom
/sbin/nologin {}{} dhcpd

awk函数

    print    : 打印
    printf    : 格式化打印
    %s        : 字符串
    %d        : 数字
    -        : 左对齐
    +        : 右对齐
    15        : 至少占用15字符

格式化输出内容

在打印出来的内容前后添加符号

{printf "{%+10s|%-20s_\n",$1,$2}

printf         格式化输出 (想使用格式化输出的话,必须使用 printf)

"{%+10s   使用花括号为每一行的第一个字符,并向后延申10个空格

|%-20s_  添加条件 在每一行输出的最后字符后延申20个空格,输出_符号

[root@LDP ~]# awk -F ":" 'BEGIN{OSF="|"}{printf "{%+10s|%-20s_\n",$1,$2}' /etc/passwd
{      root|x                   _
{       bin|x                   _
{    daemon|x                   _
{       adm|x                   _
{        lp|x                   _
{      sync|x                   _
{  shutdown|x                   _

输出第七行

使用NR == 7 指定输出第七行

[root@LDP ~]# awk -F ":" 'NR == 7{print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

运算

&&
逻辑与(AND)操作符用于连接两个条件,当且仅当两个条件都为真时,整个表达式的结果才为真。如果第一个条件为假,则不会计算第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为假。

||
 逻辑或(OR)操作符也用于连接两个条件,如果至少有一个条件为真,则整个表达式的结果为真。如果第一个条件为真,则不会计算第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为真。

!
逻辑非(NOT)操作符用于反转一个条件的真假值。如果条件为真,则应用逻辑非操作后结果为假;如果条件为假,则结果为真。

第3个字段($3)加上第4个字段($4)大于2000,且第3个字段($3)乘以第4个字段($4)大于400。如果满足条件,就输出整行内容。

[root@LDP ~]# awk -F ":" '$3 + $4 > 2000 && $3 * $4 >400{print $0}' /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

第3个字段($3)加上第4个字段($4)大于20,或者第3个字段($3)乘以第4个字段($4)大于2000。如果满足条件,就输出整行内容。

[root@LDP ~]# awk -F: '$3 + $4 > 20 || $3 * $4 > 2000{print $0}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sssd:x:998:996:User for sssd:/:/sbin/nologin
chrony:x:997:995:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin

[root@LDP ~]# awk -F: '!($3 + $4 > 9000){print $0}' /etc/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
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sssd:x:998:996:User for sssd:/:/sbin/nologin
chrony:x:997:995:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin

查找第3个字段加上第4个字段不大于10的行

!代表取反

[root@LDP ~]# awk -F: '!($3 + $4 > 10){print $0}' /etc/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值