文本处理三剑客之grep(文本抓取器)
grep 基于行匹配的文本搜索工具,并不仅仅支持单独的某个文件开始过滤,也可以基于某个目录下的所有文件开始一个文件一个文件的开始过滤每行内容,如果你想找某个关键内容或者IP的话,但是不知道在哪个文件,这个时候grep一样可以派上用场,前提是查找的目录不要太大,当前服务器负载不是特别高。
#分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
字符匹配选线以及使用介绍
. 匹配任意单个字符
cat /etc/passwd | grep "roo." 查看/etc/passwd目录下 显示包含roo后面加任意单个字符的行
[] 匹配指定范围内的任意单个字符
cat /etc/passwd | grep [bin] 查看/etc/passwd目录下 显示包含b、i、n其中任意一个字母的行
[^] 匹配指定范围外的任意单个字符
cat /etc/passwd | grep [^bin] 查看/etc/passwd目录下 显示除b、i、n三个字母之外任意的字符全部是要找的字符
[:alnum:] 任意字母和数字
cat /etc/passwd | grep [[:alnum:]] 查看/etc/passwd目录下 显示包含任意字母和数字的行
[:alpha:] 代表任何英文字母大小写 例[a-z] [A-Z]
cat /etc/passwd | grep [[:alpha:]] 查看/etc/passwd目录下 显示包含任意大小写字母的行
[:lower:] 小写字母[a-z] [:upper:] 大写字母[A-Z]
cat /etc/passwd | grep [[:lower:]] 查看/etc/passwd目录下 显示包含任意小写字母的行 [:upper:] 同样的使用方式
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符
[:cntrl:] 不可打印的控制字符 (退格、删除...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
下面几个命令概都类似 只是用虚拟机上的/etc/passwd这个目录来举例做简单的示范, 几个匹配字符还可以进行组合,接下来会进行举例。
匹配次数选项
\+ 匹配前面的字符至少一次
cat /etc/passwd | grep ["o"\+] 查看/etc/passwd 目录下每行包含o后面的全部内容
.* 任意长度的任意字符
cat /etc/passwd | grep o.* 查看/etc/passwd 目录下每行包含o后面的全部内容
\? 匹配其前面的字符0或1次
* 匹配前面的字符0到无穷次 尽可能长的匹配
\{n\} 匹配前面的字符n次 n代表任意一个数字
\{m,n\} 匹配前面的字符至少m次 至多n次
\{n,\} 匹配前面的字符至少n次
cat /etc/passwd | grep "1\{3,\}" 查看/etc/passwd 目录下前面是1后面最少跟三个1的行
\{,n\} 匹配前面的字符至多n次
cat /etc/passwd | grep "1\{,3\}" 查看/etc/passwd 目录下前面是1后面最少0最多跟三个1的行
位置锚定选项
^ 锚定行首 用于模式的最左侧
cat /etc/passwd | grep ^"\<root\>" 查看/etc/passwd 目录下(用^锚定行首 用\< \>锚定一个单词 )root开头的行
$ 行尾锚定 用于模式的最右侧
cat /etc/passwd | grep “[[:space:]]\+”$ 查看/etc/passwd 目录下结尾是空白的行 注意区分 没有用到下面一行的命令
\< \> 锚定一个单词的词首词尾
^$ 空行 ^[[:space:]]*$ 空白行
扩展正则表达式
扩展正则表达式去正则表达式的区别是扩展正则表达式中新添加了几个与正则表达式有区别的新内容
? 0次或者1次
{m} 匹配m次 m是正常数字
+ 1次或者多次
{m,n} 至少m 至多n次 m和n都是数字 但是n要大于m
#用法是一样的 就不在举例说明
grep命令
作用:作为强大的文本搜索工具,它能使用这则表达式搜索文本,并把匹配的打印出来。
选项
-v 显示不被pattern匹配到的行
cat /etc/passwd | grep -v root 显示/etc/passwd 目录下不包含root的行
-i 忽略字符大小写
cat /etc/passwd | grep -i ROOT 显示/etc/passwd 目录下包含root的行 不区分大小写
-o 仅显示匹配到的字符串
cat /etc/passwd | grep -o root 仅显示/etc/passwd 目录能匹配到的几个root 别的不会显示
-c 统计匹配到的行数
cat /etc/passwd | grep -c root 仅显示/etc/passwd 目录下有几行能匹配到root 如只有两行包含root 那结果只会显示”2“
-e 同时实现多个选项间的逻辑or关系
grep -e "cat" -e "dog" 查找文件下面有没有cat 或dog这两个字符串 有一个显示一个 有两个显示一双
-n 显示匹配到的行号 (上面这几个选项常用)
cat /etc/passwd | grep -n root 结果如果只有第五行和第六行包含root 那会在这两行前面第五行前面标5 第六行前面标6
-F 相当于fgrep
fgrep不支持正则表达式
-q 静默模式 不输出任何信息
比如不需要查看结果,但是要判断返回值是否正确的情况下,会用到或者其他场合。
-E 使用ERE
相当于适用egrep
--color 对匹配到的文本着色显示
在CentOs7系统上默认会显示颜色 7以下的系统会用到这个命令
几个组合小命令,很方便
利用df和grep,取出磁盘各分区利用率,并从大到小排序
df -h | grep -o "[[:digit:]]\+%" | grep -o "[0-9]\{1,2\}" | sort -nr
将此字符串:welcome to beijing 中的每个字符去重并排序,重复次数多的排到前面
echo "welcome to beijing " | egrep -o "[[:alpha:]]" | sort | uniq -c | sort -nr
递归查找字符串,在当前目录下。
grep -r “需检索的字符串” ./*