在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理。
awk 选项 '模式或条件 {编辑指令}' 文件1 文件2 … //过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2 … //从脚本中调用编辑指令,过滤并输出内容
sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
在使用 awk 命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||” 表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
awk信息的读入也是逐行读取的。awk 将文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。
为了操作这些不同的字段,awk 借用 shell 中类似于位置变量的方法, 用$1、$2、$3…顺序地表示行(记录)中的不同字段。另外 awk 用$0 表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk 允许在命令行中用“-F 分隔符”的形式来指定分隔符。
变量 | 意义 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第 n 个字段(第 n 列) |
FILENAME | 被处理的文件名 |
RS | 数据记录分隔,默认为\n,即每行为一条记录 |
awk ‘{print}’ shiyan.txt
awk ‘{print $0}’ shiyan.txt
awk ‘NR1,NR3{print}’ shiyan.txt
awk ‘(NR>=1)&&(NR<=3){print}’ shiyan.txt
等同于sed -n ‘1,3p’ shiyan.txt
awk ‘NR= =1 || NR= =3{print}’ shiyan.txt
awk ‘(NR%2)==1{print}’ shiyan.txt
awk ‘(NR%2)==0{print}’ shiyan.txt
awk ‘/^root.*bash$/{print}’ /etc/passwd
[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd //统计以/bin/bash/结尾的行数
4
[root@localhost ~]# awk 'BEGIN{RS=""};END{print NR}' shiyan.txt //统计以空行分隔的文本段落数
2
awk -F: ‘{print $3}’ /etc/passwd
“-F:“表示指定分隔符为冒号,默认分隔符为空格或制表符
awk -F: ‘{print $1$3}’ /etc/passwd
awk ‘BEGIN{FS=:};{print$1$3}’ /etc/passwd
awk -F: '$7”/bash”{print$1]’ /etc/passwd
awk -F “:” ‘$7~"/bash"{print $1}’ /etc/passwd
这两条命令得到的结果都是一样的,“~”的意思是匹配$7后面所有内容
awk ‘($1~“nfs”)&&(NF==8){print$1$2}’ /etc/services
awk -F: ‘($7!="/bin/bash")&&($7!="/sbin/nologin"){print}’ /etc/passwd
awk -F: ‘/bash$ /{print|“wc -l”}’ /etc/passwd
等同于 grep -c “bash$” /etc/passwd
[root@localhost ~]# awk 'BEGIN{while("w"|getline)n++;{print n-2}}' //调用w 命令,并用来统计在线用户数
2
[root@localhost ~]# awk 'BEGIN{"hostname"|getline;print$0}' //调用hostname,并输出当前的主机名
localhost.localdomain
sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。
sort 命令的语法为“sort [选项] 参数”,常用的选项如下:
将/etc/passwd 文件中的账号进行排序,默认是按首字母顺序排序
[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lisi:x:1002:1002::/home/lisi:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shi:x:1000:1000:shi:/home/shi:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
vuser:x:1003:1003::/opt/vuser:/sbin/nologin
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
第三列是数字,倒序排列
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
vuser:x:1003:1003::/opt/vuser:/sbin/nologin
lisi:x:1002:1002::/home/lisi:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
shi:x:1000:1000:shi:/home/shi:/bin/bash
root:x:0:0:root:/root:/bin/bash
将/etc/passwd 文件中第三列进行排序,并将输出内容保存至 user.txt 文件中
[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt
[root@localhost ~]# cat user.txt
root:x:0:0:root:/root:/bin/bash
shi:x:1000:1000:shi:/home/shi:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
vuser:x:1003:1003::/opt/vuser:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/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
apache:x:48:48:Apache:/usr/share/httpd:/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
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项如下:
实验用文档
[root@localhost ~]# vim shiyan.txt
1
2
3
4
5
6
7
8
9
10
10
10
aaa
aaa
bbb
删除重复行
[root@localhost ~]# uniq shiyan.txt
1
2
3
4
5
6
7
8
9
10
aaa
bbb
将实验文档中加入一些不连续的重复行
uniq -c shiyan.txt
查找文件中重复的行
[root@localhost ~]# uniq -d shiyan.txt
10
aaa
tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr 具体的命令语法格式为:tr [选项] [参数]
常用选项包括如下内容:
将大写字母转换成小写字母
[root@localhost ~]# echo "HELLO"|tr 'A-Z' 'a-z'
hello
压缩输入中重复的字符
[root@localhost ~]# echo "thiiiiiiiiiiiiiis is meeeeee" | tr -s 'ie'
this is me
删除字符串中的某些字符
[root@localhost ~]# echo 'hello world'| tr -d 'wod'
hell rl