shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)

文章目录

  • 一、 awk工具
    • 1.1 awk常见用法
    • 1.2 awk对文件的处理过程
    • 1.3 awk常见的内置变量
  • 二、 用法示例
    • 2.1 按行输出文本
    • 2.2 按字段输出文本
    • 2.3 通过管道、双引号调用 Shell 命令
  • 三、工具
    • 3.1 sort工具
    • 3.2 uniq工具
    • 3.3 tr工具

一、 awk工具

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

1.1 awk常见用法

通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理。

awk 选项 '模式或条件 {编辑指令}' 文件1 文件2//过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2//从脚本中调用编辑指令,过滤并输出内容

1.2 awk对文件的处理过程

sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

在使用 awk 命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||” 表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

awk信息的读入也是逐行读取的。awk 将文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。

为了操作这些不同的字段,awk 借用 shell 中类似于位置变量的方法, 用$1、$2、$3…顺序地表示行(记录)中的不同字段。另外 awk 用$0 表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk 允许在命令行中用“-F 分隔符”的形式来指定分隔符。

awk 命令对/etc/passwd 文件的处理过程如图:
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第1张图片

1.3 awk常见的内置变量

变量 意义
FS 指定每行文本的字段分隔符,默认为空格或制表位
NF 当前处理的行的字段个数
NR 当前处理的行的行号(序数)
$0 当前处理的行的整行内容
$n 当前处理行的第 n 个字段(第 n 列)
FILENAME 被处理的文件名
RS 数据记录分隔,默认为\n,即每行为一条记录

二、 用法示例

2.1 按行输出文本

awk ‘{print}’ shiyan.txt
awk ‘{print $0}’ shiyan.txt
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第2张图片
awk ‘NR1,NR3{print}’ shiyan.txt
awk ‘(NR>=1)&&(NR<=3){print}’ shiyan.txt
等同于sed -n ‘1,3p’ shiyan.txt
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第3张图片
awk ‘NR= =1 || NR= =3{print}’ shiyan.txt
在这里插入图片描述
awk ‘(NR%2)==1{print}’ shiyan.txt
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第4张图片
awk ‘(NR%2)==0{print}’ shiyan.txt
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第5张图片

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

2.2 按字段输出文本

awk -F: ‘{print $3}’ /etc/passwd
“-F:“表示指定分隔符为冒号,默认分隔符为空格或制表符
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第6张图片
awk -F: ‘{print $1$3}’ /etc/passwd
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第7张图片
awk ‘BEGIN{FS=:};{print$1$3}’ /etc/passwd
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第8张图片
awk -F: '$7”/bash”{print$1]’ /etc/passwd
awk -F “:” ‘$7~"/bash"{print $1}’ /etc/passwd
这两条命令得到的结果都是一样的,“~”的意思是匹配$7后面所有内容
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第9张图片
awk ‘($1~“nfs”)&&(NF==8){print$1$2}’ /etc/services
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第10张图片awk -F: ‘($7!="/bin/bash")&&($7!="/sbin/nologin"){print}’ /etc/passwd

在这里插入图片描述

2.3 通过管道、双引号调用 Shell 命令

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

三、工具

3.1 sort工具

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。

sort 命令的语法为“sort [选项] 参数”,常用的选项如下:

  • -f:忽略大小写;
  • -b:忽略每行前面的空格;
  • -M:按照月份进行排序;
  • -n:按照数字进行排序;
  • -r:反向排序;
  • -u:等同于 uniq,表示相同的数据仅显示一行;
  • -t:指定分隔符,默认使用[Tab]键分隔;
  • -o <输出文件>:将排序后的结果转存至指定文件;
  • -k:指定排序区域。
/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

3.2 uniq工具

Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项如下:

  • -c:进行计数;
  • -d:仅显示重复行;
  • -u:仅显示出现一次的行。
实验用文档
[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

将实验文档中加入一些不连续的重复行
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第11张图片
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第12张图片
uniq -c shiyan.txt
shell编程--正则表达式3(awk 工具使用方法、sort 工具、uniq 工具、tr 工具)_第13张图片

查找文件中重复的行
[root@localhost ~]# uniq -d shiyan.txt 
10
aaa

3.3 tr工具

tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr 具体的命令语法格式为:tr [选项] [参数]

常用选项包括如下内容:

  • -c:取代所有不属于第一字符集的字符;
  • -d:删除所有属于第一字符集的字符;
  • -s:把连续重复的字符以单独一个字符表示;
  • -t:先删除第一字符集较第二字符集多出的字符
将大写字母转换成小写字母
[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

你可能感兴趣的:(shell脚本,正则表达式,awk,shell)