7. grep
grep命令
- grep
grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写。
grep命令可以在它的输入中搜索指定的字符串模式(Pattern)。grep命令的输出包含输入中指定的字符串模式的行。
grep命令的一般格式:
grep [option] pattern file
- grep命令常用开关
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210145838587-40955825.png)
正则表达式
何为正则表达式:描述具有某种特征的字符串的表达式。
正则表达式由普通字符与特殊字符(元字符)
- 基本元字符集
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210145936724-1022152156.png)
' '和" ",单引号和双引号的区别
实例:查找'\'
grep -n '\\' t1.txt (\)
grep -n "\\" t1.txt grep:Trailing backslash
grep -n "\\\\" t1.txt
剖析:
双引号只能阻止部分特殊的字符:()、[]、{}
不能阻止shell对 ‘\’ 的解析,所以grep -n "\\" t1.txt 送给grep的是‘\’
- 扩展元字符集
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150035045-1628599509.png)
grep中使用正则表达式
- grep命令示例
grep ^public t1.txt //在每行的开始对public字符进行匹配
grep public$ t1.txt // 在每行的末尾对public字符进行匹配grep -n ^$ t1.txt // 查找空行grep -n ^.$ t1.txt // 查找只有一个字符的行grep -n '\<public' t1.txt // 在单词public的开始进行匹配grep -n 'public\>' t1.txt // 在单词public的末尾进行匹配grep -n "\\\\" t1.txt // 查找'\'
grep -n '\\' t1.txt // 查找'\'
注意:单引号'' 和双引号""的区别
查询多个文件,可以使用通配符 "*"
grep public *.txt
反向匹配
ps aux | grep "ssh" | grep -v "grep" // -v 反向匹配,即找出所有不包含“grep”的项
递归搜索目录中的所有文件:-r
grep -rn telnet /etc // -r 递归搜索,即找出目录/etc下所有包含内容telnet的文件行
返回匹配到的文件的名称
grep -ln clear *.txt // -l 返回匹配到的文件的名称
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150419331-1247082287.png)
vi中使用正则表达式
- 正则表达式在vi中的使用例子
在当前行中删除从aa到zz的所有字符。
:s/aa.*zz// .*:表示任意的0个或多个任意字符
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150651836-1117395885.png)
在整个文件用and代替所有的&字符
:1,$s/&/and/g
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150757395-1496788238.png)
在每一行的行首插入字符串new
:1,$s/^/new/g
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150842535-1491639601.png)
在第2行到第5行的行尾插入字符串@@
:2,5s/$/@@/g
去掉行首的所有数字字符
:s/^[0-9][0-9]*//
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210150957730-772383768.png)
-
稍复杂的一个例子
foo(10,7,2) foo(7,10,2)
foo(x+13,y-2,10) foo(y-2,x+13,10)foo(bar(8),x+y+z,5) foo(x+y+z,bar(8),5):1,$s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g[^,] 除了逗号之外的任何字符[^,]* 0或者多个非逗号字符\([^,]*\) 将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它
\([^,]*\), 我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。
![](https://img2018.cnblogs.com/blog/1526080/201812/1526080-20181210151147279-182944671.png)