linux三剑客:grep-awk-sed

grep擅长查找功能,awk擅长取列,sed擅长取行和替换

grep的两种形式

第一种: grep [option][pattern][file1,file2]
grep -v abc text.txt
第二种:command | grep[pattern]
ps -ef |grep http

常见选项

-i 搜索时忽略大小写
-w 匹配整词
-v 显示不匹配行信息(反向搜索)
-n 显示行号(文件中的行号)
-F 不按照正则表达式匹配
-r 递归搜索(搜索文件夹)
-R 就像-r一样,但是遵循所有符号链接
-l 只列出匹配的文件名,不显示具体匹配行内容
-c 只输出匹配行的数量,不显示具体内容
-h 在递归搜索文件时,输出取消前缀

实例

1.在/etc/passwd文件中搜索root用户
grep root /etc/passwd
2.使用-w参数查找仅包含整个单词都是root的行
grep -w root /etc/passwd
3.使用-i参数忽略大小写
grep -i root /etc/passwd
4.使用-v参数显示不匹配的行
grep -v root /etc/passwd
5.使用-n参数显示行号
grep -n root /etc/passwd
6.使用-r参数对文件夹进行递归搜索
grep -r root /etc/
7.使用-l参数仅显示匹配文件的文件名
grep -l root /etc/
8.使用-c参数统计出现的行的数量
grep -c root /etc/passwd
9.使用-h参数不显示递归搜索输出的文件名前缀
grep -h root /etc/

grep正则表达式

正则表达式是每个输入行要匹配的模式。模式是字符序列

限定符 描述
. 匹配任意的一个字符
匹配前面的子表达式
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
{N} 匹配前面的子表达式N次
{N,} 匹配前面的子表达式N次到多次
{N,M} 匹配前面的子表达式N到M次,至少N次至多M次
- 只要不是在序列开始、结尾或者序列的结束点上,表示序列范围
^ 匹配一行开始的字符串(可空),也表示字符不在要匹配的列表中
$ 匹配一行末尾的字符串(可空)
\b 匹配一个单词前后的空字符串。
\B 匹配一个单词中间的空字符串。
\< 匹配单词前面的空字符串。
\> 匹配单词后面的空字符串。

锚点型

使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾
grep ^zhu /etc/passwd grep zhu$ /etc/passwd
找出以单词 word 结尾的行:
grep ‘zhu$’ 文件名
匹配仅仅只包含 zhu 的行:
grep ‘^zhu$’ 文件名
搜索空行:
grep ‘^$’ 文件名

字符型

匹配 Zhu 或 zhu:
grep ‘[Zz]cm’ 文件名
也可以匹配数字 (即匹配 zhu1 或 Zhu2 等等):
grep -w ‘[Zz]hu[0-9]’ 文件名
可以匹配两个数字字符(即 zhu11、zhu12 等):
grep ‘zhu[0-9][0-9]’ 文件名
不仅仅局限于数字,也能匹配至少一个字母的:
grep ‘[A-Za-z]’ 文件名
显示含有 “z” 或 “c” 字符的所有行:
grep [zc] 文件名
[:alnum:] - 字母数字字符
[:alpha:] - 字母字符
[:blank:] - 空字符: 空格键符 和 制表符
[:digit:] - 数字: ‘0 1 2 3 4 5 6 7 8 9’
[:lower:] - 小写字母: ‘a b c d e f g h i j k l m n o p q r s t u v w x y z’
[:space:] - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符
[:upper:] - 大写字母: ‘A B C D E F G H I J K L M N O P Q R S T U V W X Y Z’
比如匹配所有大写字母:
grep ‘[:upper:]’ 文件名

通配符

可以使用 “.” 来匹配单个字符。
匹配以 “b” 开头以 “t” 结尾的3个字符的单词:
grep ‘/‘ 文件名
打印出只有两个字符的所有行:
grep ‘^..$’ 文件名
显示以一个点和一个数字开头的行:
grep ‘^.[0-9]’ 文件名

点字符转义

匹配需要.的需要字符转义比如IP地址
比如匹配192.168.0.1 IP
grep ‘192.168.0.1’ /etc/hosts 这种是不正确的
三个点字符都需要转义:
grep ‘192.168.1.254’ /etc/hosts
下面的例子只能匹配出 IP 地址:实际上由于 IP 地址中数字的取值范围,该正则表达式并不精确
egrep ‘[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}’ 文件名
搜索以“-” 符号开头的,需要加 -e来匹配或 egrep
grep -e ‘-test-‘ 文件名
grep 的“或”匹配
grep -E ‘word1|word2’ 文件名 egrep ‘word1|word2’ 文件名
grep 的“和”匹配
grep ‘word1’ 文件名 | grep ‘word2’
使用如下的语法,您可以检测一个字符在序列中重复出现次数:
{N} {N,} {min,max}
要匹配字符 “v” 出现两次:
egrep “v{2}” 文件名
下面的命令能匹配到 “col” 和 “cool” :
egrep ‘co{1,2}l’ 文件名
下面的命令将会匹配出至少有三个 ‘c’ 字符的所有行。
egrep ‘c{3,}’ 文件名