在Linux中,grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。利用这些返回值就可以进行一些自动化的文本处理工具。grep命令的语法如下:
grep 参数<配置> 文件/文件夹
其中参数定义如下:
(1)-a:不忽略二进制的数据。
(2)-b:打印匹配行距离文件头部的偏移量,以字节为单位。
例:grep -r -b vendor_ai_cust_set_next_process_mctrl --exclude-dir=.svn
图4-1 grep -b示例
(3)-c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数,比如一行有两个被匹配到,但输出只有一个。
例:grep -r -c vendor_ai_cust_set_next_process_mctrl
图4-2 grep -c示例
(4)-E:将样式为延伸的正则表达式来使用,如匹配文件中多个字符。
图4-3 grep -E示例
(5)-F:将样式视为固定字符串的列表,字符串中可以有特殊符号,例如{}、[]等。
图4-4 grep -F示例
(6)-G:使用基本规则表达式解释匹配模式,该参数为默认值。
(7)-h:查询时不显示文件名。
图4-5 grep -h示例
(8)-H:查询时显示文件名,加与不加无区别,与-h相反。
(9)-i:忽略关键字符的大小写。(跟-y参数相同)。
(10)-l:对多文件搜索关键字符时只显示文件名。
(11)-L:对多文件搜索关键字符时,只显示不匹配关键字符的文件名。
(12)-n:显示匹配结果所在行号。
(13)-q:不显示任何信息。用于if逻辑判断,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
图4-6 grep -q示例
(14)-d 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。-d后面跟的是进行的动作,一般是"grep -d read"或"grep -d recure "或"grep -d skip"。其中,read 为在当前目录查找;recure 为所有递归子目录;skip 为忽略子目录
(15)-R/-r 此参数的效果和指定"-d recurse"参数相同。
(16)-s 当搜索关键字符,不显示不存在或无匹配文本的错误信息。使用方式:"grep -s 关键字符 filename"。
图4-7 grep -s示例
(17)-v 反转或过滤搜索,即过滤出来那些不匹配关键字符的行。使用方式:"grep -v 关键字符"。
(18)-w 精准搜索关键字符,即,只匹配单词,不匹配字符串。
图4-8 grep -w示例
(19)-x 只显示整行都是关键字符的行。使用方式:"grep -x 关键字符",行匹配。
(20)-y 忽略关键字符的大小写。(跟-i参数相同)。
(21)-A<行数>:在输出的时候包含结果所在行之后的指定行数,这里指之后的x行。
(22)-B<行数>:在输出的时候包含结果所在行之前的指定行数,这里指之前的x行。
(23)-C<行数>:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行。
图4-9 grep -C示例
(24) -e 一次只能传一个匹配值,想对于-E,-E则可以采用“|”进行查询。
图4-10 grep -e示例
(25)-f 从文件中取得关键字符,以文件匹配文件。
例:grep -f b.txt a.txt 以b.txt每一行为元素,在a.txt中进行匹配,如过行元素相同,则会标红,如下图所示。
图4-11 grep -f示例
(26)--exclude-from = FILE:在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容。
(27)--exclude-dir = DIR:匹配一个目录下的不少内容同时还要让一些子目录不接受匹配,就使用此选项。
(28)--include = GLOB:仅搜索其基本名称与GLOB匹配的文件(使用--exclude下所述的通配符匹配)。
-
- Linux中nm的命令使用
nm命令的语法如下所示:
$ nm [options(s)] [file(s)]
其中,[file(s)]中可以给出多个文件,如果没有指定文件名,则默认文件是a.out。
(1)-A/-o:在输出时加上文件名。
图4-12 nm -A/-o示例
(2)-a:列出obj文件中所有的符号,包括debug所使用的符号,否则默认情况下不显示调试用的符号。
图4-13 nm -a示例
(3)-B:BSD码显示,默认为8421码显示。
(4)-C或--demangle[=style]:对低级符号名称进行解码,C++文件需要添加。
(5)-D 或--dynamic:显示动态符号而不显示普通符号,一般用于动态库。
(6)-f format或--format=format:指定输出格式,可以使用 nm -f sysv 查看变量所在的节区。
图4-14 nm -f 示例
(7)-g或--extern-only:仅显示外部符号,一般用于对静态库的函数查询。
图4-15 nm -g示例
(8)-h或--help:国际惯例,显示命令的帮助信息。
(9)-n或-v或--numeric-sort:显示的符号以地址排序,而不是名称排序。
例:nm -g -n libvendor_ai2_pub.a
图4-16 nm -n示例 图4-17 nm不加-n对比示例
(10)-p或--no-sort:不对显示内容进行排序。
图4-18 nm -p示例 图4-19 nm不加-p示例
(11)-P或--portability:按照POSIX2.0标准格式输出,等同于使用 -f posix。
图4-20 nm -P示例
(12)-V或--version:国际管理,查看nm的版本。
图4-21 nm -V示例
(13)-s:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
(14)-u: 只显示未定义的符号。
图4-22 nm - u示例
在执行nm指令之后,显示的符号代表如下:
表4-1 nm命令显示符号相关说明
符号 | 描述 |
A | 符号的值是绝对值,不会通过进一步的链接而改变。 |
B/b | 符号在 BSS 数据段中。通常包含零初始化或未初始化的数据。 |
C | 未初始化的数据。如果符号在任何地方定义,则被视为未定义的引用。 |
D/d | 符号在初始化数据段中。 |
G/g | 符号在小对象的初始化数据段中。一些目标文件格式允许更有效地访问小型数据对象,例如全局int变量,而不是大型全局数组。 |
i | 对于PE格式文件,这表示符号位于特定于实现的部分中 DLL。对于ELF格式文件,这表明该符号是一个间接函数。这是一个GNU对标准ELF 符号类型集的扩展。它表示一个符号,如果被一个重定位不计算其地址,而是必须在运行时调用。运行时然后执行将返回要在重定位中使用的值。 |
I | 该符号是对另一个符号的间接引用。 |
N | 该符号是调试符号。 |
n | 符号在只读数据段中。 |
p | 符号在堆栈展开部分中。 |
R/r | 该符号位于只读数据段中。 |
S/s | 该符号在小对象的未初始化或零初始化数据段中。 |
T/t | 符号在文本(代码)部分。 |
U | 符号未定义。 |
a | 本地不可变符号,通常为文件名 |
- 总结
(1)在代码编译阶段,遇到缺少相关的函数定义时,可以从函数是否未声明、定义函数的代码文件、相关库函数的添加方面着手,一一排查。
(2)grep的常用命令
表5-1 grep常用命令
命令 | 描述 |
grep -n | 显示行号 |
grep -l | 只显示文件名 |
grep -E “条件a | 条件b | …” | 多条件的搜索(可采用“条件a|条件b“”) |
grep -x | 按行进行匹配 |
grep -r | 递归的查找目录 |
(3)nm的常用命令
表5-2 nm常用命令
命令 | 描述 |
nm -g | 静态库、可执行文件、中间文件相关函数查询 |
nm -f sysv | 输出变量所在的区 |
nm -D | 动态库中的函数查询 |
nm -A | 输出时加上文件名 |
nm -a | 输出所有符号,包含debug符号 |