Molet

Linux零基础教程_正则三剑客之AWK

Molet linux 2023-01-25 507浏览 0

awk命令

awk本身是一种编程语言,完整来讲是绝不能一节课讲完的,这里我们只讲它的常用方法。

Linux零基础教程_正则三剑客之AWK
AWK

基本用法

语法:awk ‘pattern + {action}’ {filenames}。
pattern是匹配模式,action是操作的命令。花括号代表分组,一个分组里可以有多个表达式,就像这样{a=3;count++;}

例1.匹配包含‘oo’的行,并打印第一段:

[root@localhost tmp]# awk -F ':' '/oo/ {print $1}' passwd
root
lp
mail
operator

‘F’选项表示指定输入字符的分隔符,不指定默认以空格分隔。F选项可以是个字符串,也可以是个正则。
例2.使用空格或者逗号分隔,打印第3和6段。

[root@localhost tmp]# awk -F '[ ,]' '{print $3,$6}' ab.txt 
6 d
[root@localhost tmp]# cat ab.txt 
a b 6,8,ab d

匹配

全文匹配

例1.匹配带有‘oo’的行,并打印第一段:

[root@localhost tmp]# awk -F ':' '/oo/ {print $1}' passwd
root
lp
mail
operator

按段匹配

例2.匹配带有‘’的行,并打印第1,4行:

[root@localhost tmp]# awk -F ':' '$1~/oo/ {print $1,$4}' passwd
root 0

有个小知识点,用逗号连接输出的1,4行,默认是用空格分开,如果要换成别的字符,比如‘#’可以这样:

[root@localhost tmp]# awk -F ':' '$1~/oo/ {print $1"#"$4}' passwd
root#0

匹配多次,结果相加

例3.

[root@localhost tmp]# awk -F ':' '/root/ {print $1,$3,$4} /usr/ {print $1,$5,$6,$7}' passwd
root 0 0
operator 11 0
games games /usr/games /sbin/nologin

比较

一般用法

例1.打印第三段大于1000的行。

[root@localhost tmp]# awk -F ':' '$3>1000 {print $0}' passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

注意,这里改成这样$>”1000″——加双引号表示的意义很不一样,如果换成$>”1000″将能匹配出所有,因为它会按首字母的ascii码来算。

字段之间的比较

打印第三段大于第四段的行:

[root@localhost tmp]# awk -F ':' '$3>$4 {print $1,$3,$4}' passwd
sync 5 0
shutdown 6 0
halt 7 0

可以使用逻辑关系。
例2:打印第三段比第四段大的,并且第7段是“/sbin/nologin”的行。

[root@localhost tmp]# awk -F ':' '$3>$4 || $7=="/sbin/nologin" {print $1,$3,$7}' passwd
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync

几个变量

OFS

例1.指定连接输出字段的默认字符:

[root@localhost tmp]# awk -F ':' '{OFS="#"} $3>1000 {print $1,$3}' passwd
nobody#65534

NR

NR(number of row)表示行号。
例1.选择第20到第30行

[root@localhost tmp]# awk -F ':' '{if(NR>=20 && NR<=30) print $0}' passwdpolkitd:x:998:996:User for polkitd:/:/sbin/nologin
sssd:x:997:994:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nginx:x:996:993:Nginx web server:/var/lib/nginx:/sbin/nologin

和我们用cat -n命令查到的结果一致:

[root@localhost tmp]# cat -n passwd
    .......
    20  polkitd:x:998:996:User for polkitd:/:/sbin/nologin
    21  sssd:x:997:994:User for sssd:/:/sbin/nologin
    22  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    23  nginx:x:996:993:Nginx web server:/var/lib/nginx:/sbin/nologin

NF

NF表示字段数(number of field)。
例1.显示1-10行的行号和列数。
我们先修改passwd文件如下:

[root@localhost tmp]# cat -n passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  7:8:9
     4  ab:cd
     5  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     6  adm:x:3:4:adm:/var/adm:/sbin/nologin
     7  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     8  sync:x:5:0:sync:/sbin:/bin/sync
     9  6
    10  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

使用awk命令:

[root@localhost tmp]# awk -F ':' 'NR<10 {print NR":"NF}' passwd
1:7
2:7
3:3
4:2
5:7
6:7
7:7
8:7
9:1

运行结果符合预期。

BEGIN和END

BEGIN用来输出或者定义初始信息,END用来显示摘要,结果。
例1.输出用户人数。

[root@localhost tmp]# awk -F ':' 'BEGIN {count=0;print "count=0"} {count++;} END{print count}' passwd
count=0
25

解析:awk是一行一行执行的。执行前,BEGIN里的内容先执行,定义好count变量,输出初始信息。中间的部分是循环处理。最后END部分输出结果。

例2.统计home文件夹下文件总大小。

 ls -la|awk 'BEGIN{size=0} {size=size+$5} END{print size}'
50292

awk的内容有很多,大家入门的话先掌握这些就够用了。到后面了解的多了,有需要再去查资料吧。

继续浏览有关 Linux命令 的文章
发表评论