A正则表达式
grep -E 拓展正则表达式
元字符
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符 可以固定死,也可以表示范围
[^]匹配指定范围外的任意单个字符 [^hao]
常见字符
[:alnum:] : 字母和数字
[: alpha ] : 同时代表英文大小写字符 [A-Z],[a-z]
[:lower:] : 小写字母 [[:lower]]
[:space:]: 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白
表示次数
*# 匹配前面的字符任意次,
.* 任意长度的任意字符,不包括0次
\? 匹配之前出现的字符0次或1次 及可有可无
\+ 匹配之前的字符至少一次 及 >=1
\{n\} 匹配前面的字符 n次
\{m,n\} 匹配前面的字符最少m次最多n次
\{,n\}匹配前面的字符最多n次
\{m,\} 匹配前面的字符至少n次
[root@localhost ~]# echo google |grep 'go\{2\}gle'
#带表前面的o出现2次
google
[root@localhost ~]# echo gooooogle |grep 'go\{2,\}gle'
#带表前面的o出现2次以上
gooooogle
[root@localhost ~]# echo gooooogle |grep 'go\{2,5\}gle'
#带表前面的o出现2次以上5次以下
gooooogle
[root@localhost ~]# echo goooooogle |grep 'go\{2,5\}gle'
[root@localhost ~]#
[root@localhost ~]# echo goooooogle |grep 'go*gle'
位置锚定
^ 行首锚定 用于模式的最左侧
$ 行尾锚定 用于模式的最右侧
^PATTERN 用于模式匹配整行 (单独一行只有root)
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词左侧
\> 或 \b 词尾锚定 用于单词右侧
\<PATTERN> 匹配整个单词
分组或其他
以()将多个字符捆绑起来,当作一个整体处理
grep命令总结
grep 选项 条件 路径
-i : 忽略大小写
-v : 反向查找。取反 输出内同不包括选取内容
-c 统计与所规定条件相符的行数
-o 只显示匹配到的字符串
-q 不输出内同 静默模式
-A after 除了显示匹配行还显示其后n行 如grep -A3 及为显示匹配项后三行
-B defore 显示包括匹配项 和其后n行 grep -B3 显示匹配项和其后三行
-e 实现多个选项间的或者的关系
-w 匹配整个单词
-r 递归查找,不处理软连接
awk的基础用法
格式
awk [选项] ‘条件’ {处理动作 常见为print}
选项
-F 指定分隔符
-v 自定义变量
基础用法
print 动作
awk ‘{print}’ 无特殊处理 打印一边
print打印顺序:'BEGIN{print "1"} END {print "2"} {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3 最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印
awl ‘{print "hello"}’
awk常见内置变量
FS: 指定分隔符,默认为空格或制表符,与-F作用相同格式为 -v FS=
OFS: 指定输出时的分隔符
NF: 当前处理的行的字段个数
NR: 当前处理的行的行数(序号)
$0: 当前处理的行的整行内容
$n 当前处理行的地n段(第n列)
FILENAME:被处理的文件名
RS: 行分隔符。
示例
-F
OFS
NR
行号
当前梳理的行号
示例
如指定打印数/etc/passwd中第三行中用户的bash类型
打印出文件5-10行的内容
NF:当前处理的行的字段个数即处理行有多少列,默认按空格分列,可指定。
其中$0 为输出当前处理的整行的内容 如单独出现则可看作打印全文
$n 及指定处理第几列
RS行分隔符
行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是为换行
sed
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。
一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
sed基本用法
sed 选项 ‘脚本自身语法’ [其他处理需求, 支持标准输入管道]
常用选项
- -n 关闭自动打印 在未关闭情况下会在筛选玩所需内容后再打印全文
- -e 多点编辑 即可以同时对文本多个所需处理的字段进行处理
- -f FILE 从指定文件中读取编辑脚本
- -r, -E 使用扩展正则表达式
- -i.bak 在需要对源文件进行修改时使用 加入选项在进行替换等操作时会直接对源文件进行修改 在对重要文件进行此类操作时最好先进行备份
- -s 将多个文件视为独立文件,而不是单个连续的长文件流
sed
sed不能作为一个单独的命令来使用 会报错 需要配合后续选项进行使用
sed ' '
系统默认此模式为打印所输入的内容
aaa
aaa
ccc
ccc
sed ' ' /etc/passwd
此为显示文件内同
sed ' ' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
sed 支持重定向
如sed ' ' < /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 14 18:45:42 2023
...
sed 同样给支持管道符
sed脚本格式
指定的行,$:最后一行,需要结合选项和命令进行匹配
#,# #从#行到第#行,3,6 从第3行到第6行
#,+# #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间所有的行
sed -n '/^b/,/^f/p' /etc/passwd
'/表达式1/,/表达式2/p' (不要忘记打印)p 文件名
bin:x:1:1:bin:/bin:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
面试题
让你查找几点几分到几点几分之间的日志
sed -n '/2023:12:09/,/2023:22:25:45/p' /var/log
表示奇数或偶数
[root@localhost ~]seq 10|sed -n '1~2p'
1
3
5
7
9
[root@localhost ~]seq 10|sed -n '2~2p'
2
4
6
8
10
[root@localhost ~]seq 10|sed -n '3~3p'
3
6
9
-d选项删除
[root@localhost ~]seq 10 |sed '5d'
将第三行删除
1
2
3
4
6
7
8
9
10
-i 对源文件进行修改时启用 先备份
-i
需要修改文件本身内容时
对于重要文件需先做备份处理
seq 10 >test.txt
cat test.txt
1
2
3
4
5
6
7
8
9
10
-a 追加
seq 10 |sed '7nihao'
在第二行后追加nihao
1
2
3
4
5
6
7
nihao
8
9
搜索替代
s/原本内容/新内容/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:
修饰符:
g 全局替换 如 不添加 只是替换每行开头第一个匹配内容
p 显示成功替换的行
I,i 忽略大小写
后项引用 根据”( )“中内容和括号出现的顺序在s/ \num/中填入所取用的括号中内容对应的序号并以\num 写出来即可取出单独的此处内容
[root@localhost /]cat 1.txt |sed -r 's/.*-(.*)\.jar/\1/'
'-'之前和/之间的括号为\1此为后项目引用
及\后数字根据括号出现顺序依次排序
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5
修改配置文件
调用变量来改文件
[root@localhost selinux]name=root
[root@localhost selinux]ed -nr '/$name/p' /etc/passwd
使用双引号
[root@localhost selinux]sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost selinux]sed -nr '/'$name'/p' /etc/passwd
变量上家上单引号
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin