shell 三剑客是指在Linux/Unix系统下使用最广泛的命令行工具:grep、sed、awk
三剑客都是文本处理工具 可用于搜索、替换和处理大量文本数据,三者通常是和正则表达式一起使用
正则表达式
\ 转义符,将特殊字符进行转义,忽略其特殊意义
^ 匹配行首,awk中,^则是匹配字符串的开始
$ 匹配行尾,awk中,$则是匹配字符串的结尾
^$ 表示空行
. 匹配除换行符\n之外的任意单个字符
.* 匹配所有
[ ] 匹配包含在[字符]之中的任意一个字符
[^ ] 匹配[^字符]之外的任意一个字符
[ - ] 匹配[]中指定范围内的任意一个字符
? 匹配之前的项1次或者0次
+ 匹配之前的项1次或者多次
* 匹配之前的项0次或者多次, .*
() 匹配表达式,创建一个用于匹配的子串
{ n } 匹配之前的项n次,n是可以为0的正整数
{n,} 之前的项至少需要匹配n次
{n,m} 指定之前的项至少匹配n次,最多匹配m次,n<=m
| 交替匹配|两边的任意一项ab(c|d)匹配abc或abd
三剑客–grep
grep 擅长查找过滤
可以通过grep --help
查看
常用参数
-i:忽略大小写
-l:只输出包含匹配字符的文件名
-n:显示匹配行及行号
-v:显示不包含匹配文本的所有行
-o:只显示匹配字符串的部分
-c:只输出匹配行的计数
-r:递归查询
-h:不显示匹配行所在文件名
-H:同时显示行和文件名
-A<显示列数>或--after-context=<显示列数>:显示匹配行下?行
-B<显示列数>或--before-context=<显示列数>:显示匹配行上?行
-C<显示列数>或--context=<显示列数>或-<显示列数>:显示匹配行前后?行
-E:扩展正则表达式
-F:固定字符串搜索
-G:基本正则表达式
-q:静默模式,不输出任何信息,通过echo $?查看是否匹配到指定字符串
-s:不显示不存在或无匹配文本的错误信息-w, --word-regexp 强制 PATTERN 仅完全匹配字词-x, --line-regexp 强制 PATTERN 仅完全匹配一行-z, 一个 0 字节的数据行,但不是空行
1.过滤以#开头的行和空白行
egrep 是grep 的变体 默认使用扩展正则表达式,使egrep 处理复杂模式更灵活
grep 默认使用基础表达式 -E 默认使用基础正则表达式
grep 通常更快
egrep -v -n "^#|^$" 文件名称
grep -E -v -n "^#|^$" 文件名称
匹配任意字符,过滤空行
grep -n "." 文件名称
找到.sh文件 查找包含for关键的文件显示行数
.表示当前目录
xargs 能够捕获一个命令的输出,然后传递给另外一个命令。由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令
find . -name "*.sh" | xargs grep -in "for*"
查找重复连续出现2次以上,必须是连续哦
grep -Eni "(重复){2,}" 03.sh
错误语法:缺少(),如果是查找多个字符,需要(),单个字符可不需要
多个关键字组合使用时
表达and关系,使用 .*
表达or关系,使用 |
#两个关键字的顺序不是固定的,可以是乱序的,如果要固定就只写"测试.*重复" 或者"重复.*测试"grep -Eni "测试.*重复|重复.*测试" 03.sh
grep -Eni "echo|参数" 03.sh
查看最近有哪些IP以root身份登陆过我们的机器,统计每个IP登陆的次数。我们的思路如下:
1.通过last列出最近登陆系统的所有用户。
2.过滤出以root登陆系统的IP。
3.过滤出远程登陆的IP。
4.统计出每个IP登陆的次数。
uniq -c
统计出现的次数
#注意:'{print $3}' 使用的单引号
last |grep "root" |awk '{print $3}'|sort | uniq -c