Shell文本处理
正则表达式
-
正则表达式概述
- 正则表达式是由一串字符和元字符构成的字符串
-
egrep工具
- 以行为单位
- 默认只输出与表达式相匹配的文本行
格式1:egrep [选项] '正则表达式' 文件... ... 格式2: 前置命令 | egrep [选项] '正则表达式' -i 忽略字母大小写 -v 条件取反 -c 统计匹配的行数 -q 静默、无任何输出,一般用于检测 --看 $? 返回值,返回值为0,则说明有匹配,返回值为,则说明无匹配 -n 显示出匹配结果所在的行号 --color 标红显示匹配字串
-
基本元字符
- 行首尾及单字匹配
类型 含义 示例 说明 ^ 匹配行首 ^abc 以abc开头的行 ^ 匹配行首 ^# 以#号开头的行(比如注释行) $ 匹配行首 abc$ 以abc结尾的行 $ 匹配行首 ^$ 空行 . 单个字符 . 除换行(\n)以外的任意单个字符 # 输出以root开头的行 [root@www ~]# egrep "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash # 统计以bash结尾的行 [root@www ~]# egrep -c "bash$" /etc/passwd 38
- 未定匹配次数
类型 含义 示例 说明 + 最少匹配一次 a+ 一个或多个连续的a + 最少匹配一次 (abc)+ 一个或多个连续的abc ? 最多匹配一次 a? 0个或1个a ? 最多匹配一次 (abc)? 0个或1个abc * 匹配任意字数 a* 0个或多个连续的a * 匹配任意字数 (abc)* 0个或多个连续的abc * 匹配任意字数 .* 任意长度的任意字符 # 匹配deam,最多匹配一次 [root@www ~]# egrep "(daem)+" /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin # 创建文件 [root@www ~]# vim reg.txt [root@www ~]# cat reg.txt acd XX XX abcabcd XX # 匹配abc,最少匹配两次 [root@www ~]# egrep '(abc)+' reg.txt abcd XX abcabcd XX # 匹配任意字数 [root@www ~]# egrep '(abc)*' reg.txt abcd XX XX abcabcd XX
- {}限定次数
类型 含义 示例 说明 {n} 匹配n次 (ab){3} 匹配ababab {n,m} 匹配n~m次 (ab)(1,3) 匹配ab、abab、ababab {n,} 匹配至少n次 (ab){2,} 匹配2及以上个连续的ab [root@www ~]# egrep '(abc){2}' reg.txt abcabcd XX [root@www ~]# egrep '(abc){1}' reg.txt abcd XX abcabcd XX [root@www ~]# egrep '(abc){2}' reg.txt abcabcd XX [root@www ~]# egrep '(abc){1}' reg.txt abcd XX abcabcd XX [root@www ~]# egrep '(abc){1,3}' reg.txt abcd XX abcabcd XX [root@www ~]# egrep '(abc){2}' reg.txt abcabcd XX [root@www ~]# egrep '(abc){1,}' reg.txt abcd XX abcabcd XX
-
其他元字符
- []范围内单字匹配
示例 说明 [a|c45_?] 匹配 a、|、4、5、_、? [a-z] 匹配任意小写字符 [A-Z] 匹配任意大写字符 [0-9] 匹配任意数字 [a-Z0-9] 匹配任意字母或数字 [^A-Z] 匹配非大写字母的行 ^ [^a-z] 匹配不以小写字母开头的行 [root@www ~]# cat reg.txt abcd XX XX abcabcd XX # 不以大写字母开头的行 [root@www ~]# egrep '[^A-Z]' reg.txt abcd XX abcabcd XX # 不以小写字母开头的行 [root@www ~]# egrep '^[^a-z]' reg.txt XX
- 整体及边界匹配
类型 含义 示例 说明 () 组合为整体 (ad){1,3} 匹配:ad,adad,adadad | 或者 root|bin 匹配:root, bin \b 单词边界 \broot\b 匹配单词:root \< 单词开头 \<th 匹配以th开头的单词 > 单词结束 \<root> 作用与\broot\b一样 \w 字母数字下划线 \wa 匹配xa,不匹配#a \s 匹配空白 /sa 匹配a,不匹配xa \d 匹配数字 -P \da 匹配5a,不匹配xa 注意:其中\为转义字符,可以为一些普通字符赋予特殊含义,或者将一些特殊字符变为普通字符
# 在/etc/passwd中匹配以root或bin开头的行 [root@www ~]# egrep '^root|^bin' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin # 匹配以abc三个字母为行 [root@www ~]# cat reg.txt abc d XX XX abcabcd XX [root@www ~]# egrep '\
' reg.txt abc
sed基本用法
-
sed命令解析
格式1:sed [选项] '条件指令' 文件... ... 格式2: 前置命令 | sed [选项] '条件指令' -n 屏蔽默认输出,默认sed会输出读取文档的全部内容 -i 修改文件内容 -r 启用扩展的正则表达式 --行号可以使用单个数字或者3,5表示连续多行 --省略条件,则默认逐行处理全部文本 --匹配正则时需要使用//
-
常见处理操作动作
- 常用操作
操作符 用途 指令示例 p 打印行 2,4p 输出2、3、4行 p 打印行 2p、4p 输出第2行、第4行 d 删除行 2,4d 删除第2、3、4行 s 字符串替换 s/old/new/ 每行第一个替换 s 字符串替换 s/old/new/3 每行第三个替换 s 字符串替换 s/old/new/g 将所有的都替换 [root@www ~]# cat abc.txt aa the thethe aaathe THE THE AAAOOO # 输出所有行 [root@www ~]# sed -n 'p' abc.txt aa the thethe aaathe THE THE AAAOOO # 输出文件的行数 [root@www ~]# sed -n '$=' abc.txt 6 # 删除第3~5行 [root@www ~]# sed '3,5d' abc.txt aa the AAAOOO # 删除最后一行 [root@www ~]# sed '$d' abc.txt aa the thethe aaathe THE THE # 将第4~6行注释 [root@www ~]# cat -n abc.txt 1 aa 2 the 3 thethe 4 aaathe 5 THE THE 6 AAAOOO [root@www ~]# sed '4,6s/^/#/' abc.txt aa the thethe #aaathe #THE THE #AAAOOO
- 文本块处理
操作符 用途 指令示例 i 行前插入文本 2iYY 在第2行添加文本YY i 行前插入文本 4,7iYY 在第4~7行添加文本 a 行后插入文本 2aYY 在第2行后面添加文本 a 行后插入文本 /^XX/aYY 在以XX开头的行之后添加文本 c 替换当前行 2cYY 将第二行的内容修改为YY [root@www ~]# cat m.txt 11111111 Tarena 222 IT Group # 在第二行插入XX [root@www ~]# sed '2iXX' m.txt 11111111 Tarena XX 222 IT Group # 在第二行后面插入XX [root@www ~]# sed '2aXX' m.txt 11111111 Tarena 222 IT Group XX # 替换第二行的内容为XX [root@www ~]# sed '2cXX' m.txt 11111111 Tarena XX
awk应用
-
awk命令解析
格式1:awk [选项] '[条件]{指令}' 文件... ... 格式2: 前置命令 | awk [选项] '[条件]{指令}' -F 指定分隔符,可省略(默认空格或Tab) --其中多条指令语句可以分号分隔,print是最常用的指令
# 检查内存剩余量 [root@www ~]# free -m | awk '/Mem/{print $4"M"}' 238M # 过滤网络流量 [root@www ~]# ifconfig ens160 ens160: flags=4163
mtu 1500 inet 192.168.199.128 netmask 255.255.255.0 broadcast 192.168.199.255 inet6 fe80::20c:29ff:fe35:80d prefixlen 64 scopeid 0x20 ether 00:0c:29:35:08:0d txqueuelen 1000 (Ethernet) RX packets 52857 bytes 4466946 (4.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34976 bytes 5125073 (4.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@www ~]# ifconfig ens160 | awk '/inet\>/{print "ip地址为:",$2,"掩码信为:",$4}' ip地址为: 192.168.199.128 掩码信息为: 255.255.255.0 -
awk内置变量
变量 用途 FS 保存或设置字段分隔符,例如 FS= “:” ,与-F功能一样 $n 指定分隔的第n个字段,如$1、$3分别表示第一、第三列 $0 当前读入的整行文本内容 NF 记录当前处理行的字段个数 NR 记录当前已读入的数量(行数) [root@www ~]# cat m.txt 11111111 Tarena 222 IT Group # 输出已处理的行和列 [root@www ~]# awk '{print NR,NF}' m.txt 1 2 2 3
-
awk过滤的时机
- awk执行命令的时机包括:在所有行前、逐行、所有行后。三个时机可单独使用,或者同时一起使用。
# BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次 # { } 逐行处理,读取文件过程中执行,指令执行n次 # END{ } 行后处理,读取文件结束后执行,指令执行1次 [root@svr5 ~]# awk 'BEGIN {print NR} END{print NR}' m.txt 0 //预处理时,行数为0 2 //全部处理完以后,行数为已读入文本的行数
-
awk处理条件
- 正则表达式
条件可以用/正则表达式/ 的方式,与sed类似,其中~ 表示匹配、!~表示 不匹配。
[root@svr5 ~]# awk -F: '/^ro/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash //列出以ro开头的用户记录
- 数值比较
# == 等于、!= 不等于 # > 大于、>= 大于或等于 # < 小于、<= 小于或等于 [root@svr5 ~]# awk 'NF>=2{print}' reg.txt abcd XX //输出包含2个及以上字段的行 abcabcd XX
- 多个条件的组合
多个条件的组合使用逻辑比较连接,包括以下类型:
&& 逻辑与:期望多个条件都成立
|| 逻辑或:只要有一个条件成立即满足要求
[root@svr5 ~]# awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd //列出UID小于2的用户信息 root 0 bin 1
- 变量的运算
运算符包括以下类型:
+、-、*、/、%
++、-- 、+=、-=、*=、/=
[root@svr5 ~]# awk 'BEGIN{i=0} {i+=NF} END{print i}' reg.txt 5 //统计文本的总字段个数
一条评论
匿名
哦,好叼