文章目录
1、查找命令
grep、find都是查找命令,两者可以通过管道命令、xargs结合起来使用,从而在指定文件中查找指定内容。
这里首先记录几个命令结合起来的用法,然后说明每个命令的用法。
1.1 find、grep、管道、xargs结合使用:在指定文件中查找指定内容。
-
示例:从当前目录开始查找【所有.c文件和.h文件】,并在这些.c文件中查找【lsydebug】,不区分大小写,且显示行号
find . -name "*.[ch]" | xargs grep -nir "lsydebug"
结果展示:
$ find . -name "*.[ch]" | xargs grep -nir "lsydebug" ./test.c:7:#define LSYdebug ./board/ti/am43xx/mux.c:15://#define lsydebug(fmt,args...) ./board/ti/am43xx/mux.c:140: lsydebug("--------------->lsy\r\n"); ./board/ti/am43xx/mux.c:147:// lsydebug("--------------->lsy,board_is_evm.\r\n"); ./board/ti/am43xx/board.h:20://#define lsydebug(fmt,args...) ./board/ti/am43xx/board.h:49: lsydebug("-------------------->lsy add log, board_is_evm() \r\n");
1.2 find:查找文件
-
格式
find [path] -option [文件名查找规则] [expression] (1)find命令解析规则: find 根据下列规则判断 path 和 expression: 在命令上第一个 - ( ) , ! 之前的部份为[path],之后的是[expression]。 如果 path 是空字串则使用目前路径, 如果 expression 是空字串则使用 -print 为预设 expression。 (2)参数: -name 按名称查找 注意:文件大小查找这里:k为小写,G M为大写,否则无法查找。 -size 4k 查找等于4k的文件 -size -4k 查找小于4k的文件 -size +4k 查找大于4k的文件 -perm 555 查找权限为555的文件 -a and,逻辑与,连接2个表达式 -o or,逻辑或,连接2个表达式 -not not,逻辑非 (3)注意: 文件名如果想要匹配规则的话,必须使用双引号括起来,如 "*.[ch]",如不加双引号会报错。 (4)-exec 和 -ok -exec 和 -ok参数后面接第二条命令,find的结果交给后面的第二条命令处理。 当该2条命令出现时,后面有固定搭配:{} \; {}表示find找到的结果 \;表示结束命令 例如: 查找LSY.c文件,并将该文件改名为lsy.c find . -name LSY.c -exec mv {} lsy.c \; 两个命令的区别是: -exec会直接将find的结果进行处理; -ok会先询问是否要进行处理,用户同意后才会执行。
-
示例1:查找当前目录下所有的.c文件和.h文件
find . -name "*.[ch]"
-
示例2:查找当前目录下所有权限为664的文件
find . -perm 664
1.2.1 参数:-exec 和 -ok
-
参数解析
-exec 和 -ok参数后面接第二条命令,find的结果交给后面的第二条命令处理。 当该2条命令出现时,后面有两个符号需要同时出现: {} \; 其中: {} 表示find找到的结果 \; 表示结束命令 两个命令的区别是: -exec会直接将find的结果进行处理; -ok会先询问是否要进行处理,用户同意后才会执行。
-
示例3:查找LSY.c文件,并将该文件改名为lsy.c
find . -name LSY.c -exec mv {} lsy.c \;
-
示例4:将当前目录下所有权限为664的文件,全部修改权限为777
find . -perm 664 -exec chmod 777 {} \;
-
示例5:将当前目录下所有.c .h文件的权限全部修改权限为777
find . -name "*.[ch]" -exec chmod 777 {} \;
-
示例6:查找当前目录下大小为4k的文件
find . -size 4k
-
示例6:查找当前路径下大于4k,且小于20k的文件
find . -size +4k -a -size -20k
-
示例6:查找查找当前路径小于4k,或者大于20k的文件
find . -size -4k -o -size +20k
-
示例7:查找当前目录下【除了.c .h】之外的所有文件(-name "*.[ch]"是一个整体 ,所以-not必须放在前面)
find . -not -name "*.[ch]"
1.2 grep:查找内容
-
格式:
格式: grep [OPTIONS] PATTERN [FILE...] 即: grep 【选项】 【"要查找的字符串"】 【文件名】 options: -n 显示行号 -i 不区分大小写 -c 统计文件中字符串的个数 -w 完整匹配(即:匹配完整的字符串,忽略子字符串) --include="file" 在【指定文件(如:file.txt)】或者【指定某类文件(如:*.c)】中查找。备注:一个命令中可以多次使用该参数,具体见后面例子 如果想要递归的查找多个文件,则要加上下面参数: -r 递归地读取每个目录下的所有文件(如果想要指定一个路径,查询路径下所有文件则需要用到该参数)
-
示例1:
在当前目录下的【test.sh】文件中查找【ARCH】字符串,并显示行号
grep -n "ARCH" test.sh
-
示例2:在当前目录下的【test.sh】文件中查找【ARCH或者arch】字符串(不区分大小写),并显示行号
grep -ni "ARCH" test.sh
-
示例3:在当前路径下【所有文件中】查找字符串【lsydebug】,并显示行号,且不区分大小写
grep -nri "lsydebug"
-
示例4:统计指定文件【test.sh】中【ARCH】的个数,不区分大小写
grep -ci "ARCH" test.sh
-
示例5:在所有【.c】中查找【board_nand_init】,不区分大小写
grep -nirw --include="*.c" --include="xxx_*.dts" board_nand_init
1.3 扩展:find查找文件,并直接用vim打开
-
命令
备注:如果有多个重名文件,则会直接打开所有文件
find . -name test.c -exec vim {} \;