文章目录
扩展正则表达式
扩展正则表达式是基础正则表达式的扩充深化
grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep 或 awk 命令。
一、 egrep 工具
1.1 扩展元字符
类别 | 作用 | 示例 |
---|---|---|
+ | 匹配前面子表达式1次以上 | go+d,将匹配至少—个o |
? | 匹配前面子表达式0次或者1次 | o?d,将匹配gd或god |
( ) | 将括号中的字符串作为—个整体 | xyz)+,将匹配xyz 整体1次以上,如xyzxyz |
I | 以或的方式匹配字符串 | 例1∶ goodfood,将匹配good或者food |
例2∶g(oolla)d,将匹配good或者glad |
1.2 用法示例
查询"wood" “woood” "wooood"等字符串
egrep -n 'wo+d' test.txt
查询"bet" “best” 这两个字符串
egrep -n 'bes?t' test.txt
查询"of" 或"if"或"on" 字符串
egrep -n 'of|if|on' test.txt
查询"tast" “test” 这两个字符串
egrep -n 't(a|e)st' test.txt
二、 awk 工具
awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
grep,sed,awk 更是 Shell 编程中经常用到的文本处理工具,被称之为Shell 编程三剑客。
2.1 awk命令格式
awk 选项 ‘模式或条件{编辑命令}’ 文件1 文件2…. //过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2… //从脚本中调用的编辑指令,过滤并输出内容
2.2 awk包含几个特殊的内建变量(可直接用)如下所示:
类型 | 作用 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位; |
NF | 当前处理的行的字段个数; |
NR | 当前处理的行的行号(序数); |
$0 | 当前处理的行的整行内容; |
$n | 当前处理的行的第n个字段(第n列); |
FILENAME | 被处理的文件名; |
RS | 数据记录分隔,默认为\n,即每行为一条记录。 |
2.3 用法示例
按行输出文本
1 输出所有内容,等同于cat test.txt
awk '{print}' test.txt
2 输出所有内容,等同于cat test.txt
awk '{print $0}' test.txt
3 输出第1~3行内容
awk 'NR==1,NR==3{print}' test.txt
4 输出第1~3行内容
awk '(NR>=1)&&(NR<=3){print}' test.txt
5 输出第1行,第3行的内容
awk 'NR==1||NR==3{print}' test.txt
6 输出所有奇数行的内容
awk ‘(NR%2)==1{print}’ test.txt
7 输出所有偶数行的内容
awk ‘(NR%2)==0{print}’ test.txt
8 输出以root开头的行
awk -F: '/^root/{print}' /etc/passwd
9 输出以nologin结尾的行
awk '/nologin$/{print}' /etc/passwd
10 统计以/bin/bash结尾的行数,等同于grep –c “/bin/bash$ ” /etc/passwd
awk 'BEGIN {x=0};//bin/bash$/{x++};END {print x}' /etc/passwd
11 统计以空行分隔的文本段落数
awk 'BEGIN {RS=””} ;END{print NR}' test.txt
按字段输出文本
1 输出每行中(以空格或制表符分隔)的第三个字段
awk ‘{print $3}’ test.txt
2 输出每行中第1,3个字段
awk ‘{print $1,$3}’ test.txt
3 输出密码为空的用户的shadow记录
awk -F: ‘$2=="!!"{print}’ /etc/shadow
4 输出密码为空的用户的shadow记录
awk ‘BEGIN {FS=":"} ; $2=="!!"{print}’ /etc /shadow
5 输出以冒号分隔且第7个字段中包含/bash的行的第一个字段
awk -F: ‘$7~"/bash"{print $1}’ /etc/passwd
6 输出包含8个字段且第一个字段中包含nfs的行的第1,2个字段
awk ‘($1~“nfs”)&&(NF==8){print $1,$2}’ /etc/services
7 输出第七个字段既不为/bin/bash也不为/sbin/nologin的所有行
awk -F: ‘($7 != “/bin/bash”)&&($7 != “/sbin/nologin”){print}’ /etc/passwd
通过管道、双引号调用Shell命令
1 调用wc –l命令统计使用bash的用户的个数,等同于grep –c “bash$ ” /etc/passwd
awk -F: ‘/bash $/{print | “wc -l”}’ /etc/passwd
2 调用w命令,并用来统计在线用户数
awk ‘BEGIN {while (“w” | getline) n++ ; {print n-2}}’
3 调用hostname,并输出当前主机名
awk ‘BEGIN {“hostname” | getline ; print $0}’
2.4 awk工作原理
逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
三、sort 工具
sort是一种以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。
字符排序 (默认)
数字排序
3.1 语法格式
sort [选项] 参数
3.2 常用选项
选项 | 作用 |
---|---|
-f | 忽略大小写; |
-b | 忽略每行前面的空格; |
-M | 按照月份进行排序; |
-n | 按照数字进行排序; |
-r | 反向排序; |
-u | 等同于uniq,表示相同的数据仅显示一份; |
-t | 指定分隔符,默认使用[TAB]键分隔; |
-o<输出文件> | 将排序后的结果转存至指定文件; |
-k | 指定排序区域 |
3.3 用法示例
1 将/etc/passwd 文件中的账号进行排序。
sort /etc/passwd
2 将/etc/passwd 文件中第三列进行反向排序。
sort -t “∶” -k 3 /etc/passwd
这命令读取/etc/passwd 文件的内容,将其每行内容使用∶进行分割,然后按照第三个字段进行排序。
3 按照数值排序
sort -nt “∶” -k 3 /etc/passwd
四、uniq 工具
uniq工具在Linux系统中通常与sort命令结合使用,用于报告或者忽略文件中的重复行
4.1 常用选项
选项 | 作用 |
---|---|
-c | 进行计数; |
-d | 仅显示重复行; |
-u | 仅显示出现一次的行 |
4.2 用法示例
删除file文件中的重复行。
uniq -cd file
五、tr 工具
tr命令常用来对来自标准输入的字符进行替换、压缩和删除
5.1 语法格式
tr [选项] [参数]
5.2 常用选项
选项 | 作用 |
---|---|
-c | 取代所有不属于第一字符集的字符; |
-d | 删除所有属于第一字符集的字符; |
-s | 把连续重复的字符以单独一个字符表示; |
-t | 先删除第一字符集较第二字符集多出的字符,做替换 |
5.3 用法示例
1∶ 将输入字符由大写转换为小写。
echo "KGC"│ tr ‘A-Z’ ‘a-z’
kgc
2∶ 压缩输入中重复的字符。
echo “thissss is a text linnnnnnne.” | tr -s ‘sn’
this is a text line.
3∶ 删除字符串中某些字符。
echo ‘hello world’ | tr -d ‘od’
hell wrl
4∶ 取代所有不属于第一字符集的字符
echo abccabacca | tr -c ab 0
ab00aba00a0
5∶先删除第一字符集较第二字符集多出的字符,做替换
echo abcabc123 | tr -t ‘abc’ ‘d’
dbcdbc123
echo abcabc123 | tr -t ‘abc’ ‘ttt’
tttttt123
echo abcabc123 | tr -t ‘ab’ ‘ttt’
ttcttc123