2.2.5 find和awk命令
在底层的开发过程中,使用查找相关命令进行关键字、正则表达式等的查找匹配,对于整个流程的编写是很有帮助的。
在源码的学习中,提倡使用cscope+vim的方式进行代码的查看,这个方法对于源码中的函数调用、宏变量等可以得到具体的输出,方便进行浏览。而对于源码中相关模块和驱动在进行编写时建议使用find、awk这两个命令,可以达到事半功倍的效果。因此在本节,对这两个命令进行详细讲解。
1.find命令
Linux下的文件表达格式非常复杂,对于Linux新手而言,find命令是了解和学习Linux文件特点的最佳方式之一。因为Linux发行版众多,各个发行版的升级很快,对于曾经熟悉的Linux中的某个配置文件所在位置,有时也无法按图索骥地找到。
虽然可以使用locate命令进行文件的查找,但仅仅是进行模糊匹配。locate命令是对生成的数据库进行遍历,生成数据库的命令为updatedb。这一特性决定了用locate查找文件的速度很快,但是相应的精确度就会差点。所以,这里重点介绍find命令。
若想查找系统配置文件fstab在哪个目录下,可以切换到根目录,并使用如图2-20所示命令。
图2-20 find命令查找fstab文件
图2-20中查找命令为find/-name fstab。经过查找,输出结果显示fstab文件在/etc/目录下,如图2-20最后一行所示。
图2-21演示的是对不完整的文件名进行的查找。查找在/etc目录下所有的包含wireless字样的文件。
图2-21 find命令查找带有wireless字样的文件
由图2-21可见,输出结果中有Permission denied的目录。产生这一输出的原因是,在Linux系统中,find命令是所有系统用户都可以使用的命令,并不是ROOT系统管理员的专有权力。一旦Linux系统上系统管理员ROOT设定文件目录的权限为禁止访问,则find命令无法对这些文件进行读操作,就会出现Permission denied的字样。这时候通过特殊文件/dev/null,可以重定向这些错误信息到这个文件,避免它们显示到输出中。/dev/null文件用于表明空的或者错误的信息。
使用如下命令,可以方便地根据文件的特征进行文件查找。
find /-amin-10#查找系统最后10分钟内访问的文件 find /-group favorming #查找系统中属于favorming group的文件 find /-mmin-5 #查找系统中最后5分钟内修改过的文件
find命令可以通过递归的方式使用,以便对一个文件夹中的每个子文件夹所包括的文件进行信息匹配。当然通过指定参数–maxdepth选项,可以对这个递归查找方式的深度进行限制。
图2-22演示了多个命令一起使用的状况,例如对于文件的查看操作。用户通常希望在知道路径的情况下同时看到它的属性,这时候可以采取这种方式。
图2-22 find命令查找路径及查看文件属性
命令运行结果将所有包含有source的文件及其相关的属性都显示了出来。
2.awk命令
awk名称来源于它的3位创始人Alfred Aho、Peter Weinberger、Brian Kemighan的姓氏的首字母。相对于grep的查找,awk命令具有更强大的功能,是一个强大的文本分析工具。
但更多时候awk是一种进行文本分析的编程语言,需要由用户自定义函数和动态正则表达式进行处理。
下文将介绍一些关于awk命令的使用。
awk命令打印出vivado.log文件中所有包含set的行的内容,如图2-23所示。
图2-23 awk命令匹配字符串
打印出vivado.log文件中每一行的第一个字段的带参命令如图2-24所示。字段从行的左端开始,以空白符为分隔。若需要打印第N个字段,只需要在$1后面加上相应的$N即可。
图2-24 awk命令打印每行第一个字段
如果将以上两条命令结合起来,即可打印出所有包含set的行的第一个和第三个字段,如图2-25所示。
图2-25 awk命令打印包含set的行的第一和第三个字段
关于awk命令,更多的时候是将其看作一门编程语言进行操作,以实现更多更复杂的功能。若再加入正则表达式和函数定义,其功能将更加强大。