命令行工具篇 | grep, findstr
文本匹配(查找/筛选/过滤)工具:grep(Linux命令行),findstr(Windows命令行)
1. grep
功能:过滤文件中符合某些文本模式(例如包含指定字符)的文本
用例1:检索包含字符串"Hello"的内容
grep "Hello" file.txt
用例2:检索仅包含"behilos"的文本 [1]
grep '^[behilos]*$' /usr/dict/web2
- [behilos]代表字符集合{b, e, h, i, l, o, s};
详细指令文档、正则表达式、预定义的集合,在Linux命令行中使用 man grep 查看。
注:类Unixshell中双引号与单引号的使用
1. 单引号(强引用):
- shell会忽略括号内的所有字符的特殊含义
- 变量(如
$PATH
)不会被展开 - 正则表达式中的特殊字符(如
$
,*
,!
)会原封不动地传递给grep
; - 编写正则表达式时最安全、最推荐的方式,避免了 shell 的意外干扰;
2. 双引号(弱引用):
- shell会处理括号内大部分字符的特殊含义;
- 例如:遇到变量(如
$USER
)会被展开,命令替换(如$(whoami)
)会被执行;
例如,shell 会先将 $USER 替换成当前用户名,再传递给 grep
grep "Hello, $USER" file.txt
2. finstr
功能:检索文件中的文本模式,类似于Linux中的grep;
(栈溢出逆向的使用场景:写ROP链时检索预处理过的Gadget列表;)
用例:筛选每行中包含字符串“任意字符串开头+push esp+任意字符串+ret;结尾”的内容;
findstr /r /c:"^.*push esp.*ret;$" gadgets.txt > findstr-output.txt
/r
:将搜索字符串作为正则表达式进行处理(默认设置)/c:<string>
:使用指定的文本作为文本搜索字符串(字符串有空格的时候使用双引号包括);.*:
匹配中间任意数量的任意字符^:
行首$:
行尾
正则表达式使用文本字符和元字符查找文本模式,而不是确切的字符串;
- 文本字符是在正则表达式语法中没有特殊含义的字符,它只是匹配该字符的出现,字母和数字是文本字符;
- 元字符是正则表达式语法中具有特殊含义的符号(运算符或分隔符);
元字符
Meta-character 元字符 | Value |
| 通配符 - 任何字符 |
| 重复 - 上一个字符或类出现零次或多次。 |
| 起始行位置 - 行的开头。 |
| 结束行位置 - 行的末尾。 |
| 字符类 - 集合中的任意一个字符。 |
| Inverse class - 不在集合中的任意一个字符。 |
| 范围 - 指定范围内的任何字符。 |
| 转义 - 元字符的字面使用。 |
| 起始单词位置 - 单词的开头。 |
| 结束单词位置 - 单词的结尾。 |
findstr 常用参数:
Parameter | Description |
/r | 将搜索字符串作为正则表达式进行处理。 这是默认设置。 |
/c: | 使用指定的文本作为文本搜索字符串。 |
| 指定要在 文件名中搜索的文本。 Required. |
/i | 在搜索字符串时忽略字符大小写。 |
/v | 仅打印不包含匹配项的行。 |
*使用/c:
指定搜索字符串的时候,有空格的字符串的正则需要用双引号包裹;
- findstr (Windows 命令行中)的单引号不能替代双引号的使用;
- 未使用双引号的时候会自动以空格截断,下一个字符串会被作为检索的目标文件名;
参考引用
[1] 《UNIX传奇》P87
[2] https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/findstr
- 正则表达式的匹配需要进行测试验证;
grep
默认使用基本正则(BRE),grep -E
使用扩展正则(ERE);