Linux之三剑客
Linux的三个命令,主要是用来处理文本,grep,sed,awk,处理日志的时候使用的非常多
1 grep
对文本的内容进行查找
1) 基础用法
shell
语法
grep 选项 内容|正则表达式 文件
选项:
-i 不区分大小写
-v 排除,反选
-n 显示行号
-c 统计个数
查看文件里包含有的内容
[root@localhost opt]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
查看内容不区分大小写
[root@localhost home]# grep -i 'root' a.txt
root
ROOT
查看内容不包含有root
[root@localhost home]# grep -v 'root' a.txt
ROOT
asdsad
43543543
/'.;.'
查询root显示行号
[root@localhost home]# grep -n 'root' a.txt
1:root
6:root
查看包含有root行的个数
[root@localhost home]# grep -c 'root' a.txt
2
2) 正则表达式
- 基础正则表达式
正则表达式 | 作用 |
---|---|
^ | 以xxx开头 |
$ | 以xxx结尾 |
^$ | 匹配空行 |
. | 任意一个字符 |
\ | 转义字符 |
* | 前面的字符出现0-n次 |
.* | 匹配所有字符 |
[] | 只能是[]里的字符中任意一个 |
[^] | 非[]里的字符 |
- 拓展正则表达式
egrep '拓展正则' 文件名
正则表达式 | 作用 |
---|---|
| | 或 |
+ | 前面的字符出现1-n次 |
? | 前面的字符出现0次或1次 |
() | 把括号里的内容整体匹配 |
{m,n} | 前面的字符至少出现m次,最多出现n次 |
- perl正则
grep -P 'perl正则' 文件名
正则表达式 | 作用 |
---|---|
\d | 所有的数字 |
\s | 空白字符 |
\w | 数字字母_ |
案例
查看/etc/sysconfig/selinux里不包含空行和注释信息
[root@localhost home]# egrep -v '^$|#' /etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted
2 sed
1) 概述
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。
2) 语法
sed 选项 操作 文件
3) 查看
查看所有内容
sed -n 'p' 文件名
查看第3行内容
sed -n '3p' 文件名
查看第3-5行内容
sed -n '3,5p' 文件名
查看偶数行内容
sed -n 'n;p' 文件名
查看奇数行内容
sed -n 'p;n' 文件名
查看包含有root内容的行
sed -n '/root/p' 文件名
查看包含有a至包含有b的所有内容行
sed -n '/a/,/b/p' 文件名
案例:查看tomcat日志中的2023年6月1日的日志
[root@localhost opt]# sed -n '/2023-06-15/p' logsp2p.log
4) 运行过程
5) 新增
a:往指定的行下追加内容
sed '3a 内容' 文件名
c:往指定的行替换成新的内容
sed '3c 内容' 文件名
i:往指定的行前插入内容
sed '3i 88 aaaaaaaaa' a.txt
如果想要修改源文件需要在选项使用-i
shell
sed -i '3i 88 aaaaaaaaa' a.txt
[root@localhost home]# cat a.txt
1 asdsadsadsa
2 asdasdsafdg
88 aaaaaaaaa
3 trytuytuyt
4 jhlkjlklj
5 32r3r43t
6 gjuku
7 gjukiuk
8 kiulkiul
9 wdewfew
6) 删除
shell
删除指定的行
[root@localhost home]# sed '3d' a.txt
1 asdsadsadsa
2 asdasdsafdg
4 jhlkjlklj
5 32r3r43t
6 gjuku
7 gjukiuk
8 kiulkiul
9 wdewfew
删除包含有内容的行
sed '/内容/d' 文件名
[root@localhost home]# sed '/1/d' a.txt
2 asdasdsafdg
3 trytuytuyt
4 jhlkjlklj
5 32r3r43t
6 gjuku
7 gjukiuk
8 kiulkiul
9 wdewfew
[root@localhost home]# sed '/1/,/6/d' a.txt
7 gjukiuk
8 kiulkiul
9 wdewfew
3 awk
取文本的行或列内容
语法
shell
awk [-F '指定字符'] "{print 列|行}" 文件名
-F省略不写的时候.默认是以空白字符拆分
取列
awk '{print $0}' a.txt 以空白字符拆分 取列
$0 所有的列
$1 取第一列
$2 取第二列
......
$NF 取最后一列
$(NF-1) 取倒数第二列
取行
awk 'NR==行数' 文件名
NR 当前处理的行号
取1-6行
awk 'NR>=1 && NR<=6' 文件名
&& 且 || 或
取行列
awk -F ':' '$3>=500{print$3}' 文件名
awk -F ':' '{print $3}' /etc/passwd | awk '$0>=500'
[root@localhost home]# awk -F ':' '$3>=500{print $3}' /etc/passwd
999
998
注意:条件筛选时使用单引号