目录
正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是:由普通字符与元字符组成的文字模式
普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符
正则表达式一般用于脚本编程与文本编辑器中
支持的正则表达式
脚本的内容一般都会比较多,但是我们不会每次都通过vim命令进入脚本来对其进行查询或修改,因此我们可以通过命令直接对脚本的内容来进行查询、过滤与修改。
| 支持正则的shell命令 | 正则类型 |
|---|---|
| grep | 默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符) |
| egrep 或grep -E | 使用扩展的正则表达式(ERE) |
| sed | 默认使用基本正则表达式(BRE) |
| awk | 使用扩展正则表达式(ERE) |
grep [选项] [查找条件(正则)] [目标文件]
| 常用选项 | 功能 |
|---|---|
| -n | 列出所匹配的文本行,并显示行号 |
| -i | 匹配时忽略字符大小写 |
| -v | 反向匹配,匹配的字符串与搜索的不相符 |
| -w | 精确匹配。匹配整个单词、 一个字符 |
| -o | 只显示匹配的部分 |
| -c | 显示匹配内容的行数 |
| -E | 开启扩展的正则表达式 |
| --color=auto | 可以将找到的关键词部分加上颜色的显示! |
| ^ | 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配"^"字符本身,需要转移"\^" |
| $ | 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则"$"也匹配'\n'或'r' |
| . | “.”代表除"\n\s"之外的任何单个字符 |
| \ | 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的 特殊意义 |
| * | 匹配前面的子表达式零次或多次。要匹配"*"字符,要进行\转移 |
| [ ] | 字符集合,匹配所包含的任意的一个字符 |
| [^] | 复制字符集。匹配未包含在[ ]内的任意一个字符 |
| [n1-n2] | 字符范围。匹配指定范围内的任意一个字符。例如[a-z]可以匹配到a到z范围内的任意一个小写字母字符 |
| {n} | n是一个非负整数,匹配确定的n次,例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配到“food”中的“oo” |
| {n,} | n是一个非负整数,至少(最少)匹配n次。例如,“o{2,}”不能匹配"Bob"中的“o”,但是能匹配“fooooood”中的所有o。“o{1.}”等于“o+” |
| {n,m} | n和m均为非负整数,其中n<=m,最少匹配n次,最多匹配m次 |
grep 选项 文件
过滤文本中的字符串
命令产生的字符
-
- grep [选项] 查找条件 目标文件
-
- -i:查找时忽略大小写
-
- -v:反向查找,输出与查找条件不相符的行
-
- -o 只显示匹配项
-
- -f 对比两个文件的相同行
-
- c 匹配的行数


-
- 选项:
- -color=auto 对匹配到的文本着色显示
- -m 匹配一定次数后停止
- -v 显示不被pattern匹配到的行,即取反
- -i 忽略字符大小写
- -n 显示匹配的行号
- -C 统计匹配的行数
- -o 仅显示匹配到的字符串
- -q 静默模式,不输出任何信息
- -A after, 后多少行
- -B before, 前多少行
- -C context, 前后各多少行
- -e 实现多个选项间的逻辑or关系
- -W 匹配整个单词
- -E 使用ERE, 相当于egrep
- -F 不支持正则表达式,相当于fgrep
- -f file根据模式文件,处理两个文件相同内容把第一个文件作为匹配条件
- -r 递归目录,但不处理软链接
- -R 递归目录,但处理软链接
-








综合应用


-
- sed -e '编辑指令' 文件1 文件2...
- sed -n -e '编辑指令' 文件1 文件2...
- sed -i -e '编辑指令' 文件1 文件2...
-
- ###编辑命令格式
- 地址:可数字、正则表达式、$,没有地址代表是所有行
- 操作:可以使a、c、d、p、r、w、s、y等
- 参数:一般有g,代表只要符合条件的全部进行处理
-
- ##参数说明:
- -e:指定要执行的命令,只有一个编辑命令时可以省略
- -n:只输出处理后的行,读入时不显示
- -i:直接编辑文件,而不输出结果
- -f:用指定的脚本文件来处理输入的文本文件
- -s:将多个文件视为独立文件,而不是单个连续的长文件流
-
- ##动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
- d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
- 例如 1,20s/old/new/g
sed编辑器有两种寻址方式
1.以数字形式表示行区间
2.用文本模式来过滤出行
- [root@localhost ~]# sed -n '1p' one.sh #打印第一行内容
- one
- [root@localhost ~]# sed -n '$p' one.sh #打印最后一行的内容
- five
- [root@localhost ~]# sed -n '1,3p' one.sh #打印1~3行的内容
- one
- two
- three
- [root@localhost ~]# sed -n '3,$p' one.sh #打印第3行到最后一行的内容
- three
- four
- five
- [root@localhost ~]# sed -n '1,+3p' one.sh #打印1之后的连续3行,即1~4行
- one
- two
- three
- four
- [root@localhost ~]# sed '5q' one.sh #打印前5行信息后退出,q表示退出
- one
- two
- three
- four
- five
- [root@localhost ~]#
- [root@localhost ~]# sed -n 'p;n' one.sh #打印奇数行
- one
- three
- five
- [root@localhost ~]# sed -n 'n;p' one.sh #打印偶数行
- two
- four
- [root@localhost ~]# sed -n '2,${n;p}' one.sh
- three
- five
- #从第二行开读取到最后一行,但是碰到n就是直接移动到下一行遇到p打印,开始读取形成了循环,以此类推打印奇数行
- [root@localhost ~]# sed -n 'p;n;p' one.sh
- one
- two
- three
- four
- five
- [root@localhost ~]# sed -n 'n;p;n' one.sh
- two
- five
- #简单来说n是不打印p是打印,循环就是npnnp,所以2和5就打印出来了
-
- sed 'd' 文件名 #全删
- sed '3d' 文件名 #删除第3行
- sed '1d;$d' 文件名 #删除第一行与最后一行
- 去除空行:
- grep -v "^$" 文件名
- cat 文件名 | tr -s "\n"
- sed '/^$/d' 文件名 #加i执行
-
- sed '/nologin$/!d' /etc/passwd #删除/etc/passwd中除了nologin结尾以外所有的行
- sed '/2/,/3/d' 文件名 #从第一个位置打开行删除功能,到第二个位置关闭行删除功能
sed '3p' 2.txt 第3行自动打印

sed -n "3p" 3.txt 等同于 cat test.txt sed -n 关闭自动打印

逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
-
- awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
- awk -f 脚本文件 文件 1 文件 2 …
FS:指定每行文本的字段分隔符,缺省为空格或制表位(tab)
OFS:输入字段的分割符(默认是空格)
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)
ORS:输出行的分割符,默认为换行符
RS:行分隔符,根据RS的定义把资料切割成许多条记录
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
- #打印出所有内容并且输出行号
- [root@yzy ~]# awk -F: '{print NR,$0}' one.sh
- 1 one
- 2 two
- 3 three
- 4 four
- 5 five
- 6 six
- 7 seven
- 8 eight
- 9 nine
- 10 ten
- 11 eleven
- 12 twelve
指定分隔符 打印第1 2 3列 head /etc/passwd | awk -F: '{print $1,$2,$3}

指定分隔符输出第3列大于1000 awk -F: '$3>1000' /etc/passwd

指定分隔符输出第3列<5的,且打印第1 3 列 awk -F: '$3<5{print $1,$3}' /etc/passwd

查找本机ip ifconfig ens33 | awk '/netmask/ {print $2}'


指定x为分隔符打印第1列 head /etc/passwd | awk -Fx '{print $1}'

输出时用空格隔开需要在$直接加逗号(,) head /etc/passwd | awk -F: '{print $1,$2,$3}'

列之间插入制表符 “\t” head /etc/passwd | awk -F: '{print $1"\t"$2"\t"$3}'

以 . 为分割 awk -F. '{print $2}' 3.txt
