基础正则
- 正则表达特殊符号
- [:alnum:]代表英文大小写字母及数字
- [:alpha:]代表英文大小写字母
- [:blank:]代表空格和 tab 键
- [:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
- [:digit:]代表数字
- [:graph:]代表空白字符以外的其他
- [:lower:]小写字母
- [:print:]可以被打印出来的任何字符
- [:punct:]代表标点符号
- [:upper:]代表大写字母
- [:space:]任何会产生空白的字符如空格,tab,CR 等
- [:xdigit:]代表 16 进位的数字类型
- 查找小写字母:
grep -n '[[:lower:]] regular_express.txt
- 查找数字:
grep -n '[[:digit:]] regular_express.txt
grep 与正则
- 搜索特定字符串
-
-a :将 binary 档案以 text 档案的方式搜寻数据
-
-c :计算找到 ‘搜寻字符串’ 的次数
-
-i :忽略大小写的不同,所以大小写视为相同
-
-n :顺便输出行号
-
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
-
grep -n 'the' regular_express.txt
-
grep -in 'the' regular_express.txt
忽略大小写 -
grep -vn 'the' regular_express.txt
没有the的
-
- 字符组匹配
- 字符组支持由连字符“ - ”来表示一个范围。当“ - ”前后构成范围时,要求前面字符的码位小于后面字符的码位。
- [^…] 排除型字符组。排除后面的字符。
- [abc] :表示“a”或“b”或“c”
[0-9] :表示 0~9 中任意一个数字,等价于[0123456789]
[\u4e00-\u9fa5] :表示任意一个汉字
[^a1<] :表示除“a”、“1”、“<”外的其它任意一个字符
[^a-z] :表示除小写字母外的任意一个字符
- [abc] :表示“a”或“b”或“c”
- 例子:
grep -n 't[ae]st regular_express.txt'
查找’tast’ ‘test’grep -n '[^#] regular_express.txt'
查找不含“#”字符串grep -n [^g]oog regular_express.txt
查找oog前无g的字符串grep -n [^g]oog regular_express.txt
查找oog前无g或者o的字符串
- 行首符号
^
与行尾符$
- 你想要只查找行首为“the”的字符行,则使用以下命令:
grep -n '^the' regular_express.txt
- 查找行首为大写字母的所有行:
grep -n '^[A-Z]' regular_express.txt
[^A-Z]
表示除A-Z所有字符 - 查找以d结尾的行
grep -n 'd$' regular_express.txt
- 查找空行
grep -n '^$' regular_express.txt
- 你想要只查找行首为“the”的字符行,则使用以下命令:
- 任意一个字符
.
与重复字符*
- 查找a?ou?的字符:
grep -n 'a.ou.' regular_express.txt
:
*
代表重复前面0个或者多个字符grep -n 'e*' regular_express.txt
表示具有空字符或者一个以上 e 字符。grep -n '@*' regular_express.txt
代表匹配所有grep -n 'eee*' regular_express.txt
代表前面两个e必须有,第三个则可以是0或者多个e
- 查找a?ou?的字符:
- 限定连续字符范围{}
- { }可限制一个范围区间内的重复字符数。举个例子,若要找出 2~5 个 o 的连续字符串,如何做? 此时便要用到{}了。由于 { 与 } 在 shell 中有特殊意义,需要用到转义字符\。
- 查找连续的两个 o 字符:
grep -n 'o\{2\}' regular_express.txt
结果与命令
grep -n 'ooo*' regular_express.txt
的结果相同。 - 查找 g 后面接 2 到 5 个 o,然后再接 g 的字符串
grep -n 'go\{2,5\}g' regular_express.txt
sed 与正则
- sed 把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
- 删除
d
nl regular_express.txt | sed '2,5d'
nl
输出行号'2,5d'
表示删除2-5行nl regular_express.txt | sed '2,$d'
删除第三到最后一行sed -i '1d' regular_express.txt
从源文件删除第一行
- 添加:
nl regular_express.txt | sed '2a test'
:再第二行后添加test字符串nl regular_express.txt | sed '2i test'
:在第二行前nl regular_express.txt | sed '2a test\ntest'
:在第二行后加两行test
- 替换
nl regular_express.txt | sed '2,5c No 2-5 number'
2-5行换为 No 2-5 number - 列出:
nl regular_express.txt | sed -n '5,7p'
列出5-7行
扩展正则
grep -v '^$' regular_express.txt | grep -v '^#'
是正规表示;化为扩展:egrep -v '^$|^#' regular_express.txt
- grep -E 与 egrep 相当于命令别名关系。
+
:表示重复一个或一个以上的前一个 RE 字符egrep -n 'go+d' regular_express.txt
- 普通写法:
grep -n 'goo*d' regular_express.txt
?
:表示重复零个或一个前一个 RE 字符egrep -n 'gd|good' regular_express.txt
|
:找出数个字符串:egrep -n 'gd|good' regular_express.txt
()
:找出群组字符串:egrep -n 'g(la|oo)d' regular_express.txt
()+
多个重复群组判别:- 找开头是 A 结尾是 C 中间有一个以上的 ‘xyz’ 或字符串:
echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
练习题:
新建结果文件 /home/shiyanlou/result ,将用户记录的编辑结果(如查找结果等)输出到该文件中
要求顺便输出行号
找出登录 Shell 为 bash 的用户行记录
找出 UID 或 GID 是5位数及以上的用户行记录
有主目录在 /var/spo??l 下的用户,但想不起来 spo 到底有几个 o ,找出满足条件的用户行记录
已知有个用户其用户名形如 ‘mi…M’ 中间有多个未知的 mi,找出该用户行记录