shell grep指令详解
grep 参数:
-e : 使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符(- )开头的图案。指定字符串做为查找文件内容的样式
-f : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式
-w: 精准匹配字符串,必须完全符合,包含大小写下划线空格等
-i: 忽略大小写,可以和 -w 一起使用
-o: 参数只输出匹配到的字符串,不会输出匹配行中其他的信息
-r: 递归文件夹,从当前文件夹向下递归查找所有子文件夹中的文件(不包含链接文件,包含二进制文件,文本等)
-n: 匹配到具体字符串后,显示字符串在文本中的行数,或者是组合指令中显示匹配的字符串是在上一个指令输出的第几行
-R: 查找所有文件包含子目录
重要参数(查询排除指定文件夹,或者二进制文件):
–binary-file=without-match: 排除二进制文件查询。
--exclude=GLOB: 跳过基本名称与GLOB匹配的文件(使用通配符匹配)。文件名GLOB可以使用 * 和[...]作为通配符,和\引用通配符或反斜杠字符。
搜索其文件名和GLOB通配符相匹配的文件的内容来查找匹配使用方法: grep -H --exclude=c* "old" ./* c*是通配文件名的通配符./* 指定需要先通配文件名的文件的范围,必须要给*,不然就匹配不出内容,(如果不给*,带上-r选项也可以匹配)。
--exclude-dir=poky: 跳过指定的目录,指定的poky目录下的任何文件都不会去查找。匹配一个目录下的很多内容的同时,还要让一些子目录不接受匹配,就使用此选项。
--exclude-from=FILE: 跳过文件和目录匹配,跳过FILE(文件或者文件夹),但是这条指令在跳过文件夹时,没有直接使用--exclude-dir效率高。
--include=GLOB: 仅搜索其基本名称与GLOB匹配的文件(使用--exclude下所述的通配符匹配)
上下文前后行匹配:
-A n 匹配行的后 n 行,A是after
-B n 匹配行的前 n 行,B是before
-C n 匹配行的,前后各 n 行, 前面 n 行要显示出来,后面n 行也要显示出来
grep 打印显示匹配到行的前后行。如果在只是想匹配模式的上下几行,grep可以实现。
$grep -5 'parttern' file_name //打印匹配行的前后5行
$grep -C 5 'parttern' file_name //打印匹配行的前后5行, 前面5行,后面5行
$grep -A 5 'parttern' file_name //打印匹配行的后5行
$grep -B 5 'parttern' file_name //打印匹配行的前5行
grep 正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义
^: 匹配正则表达式的开始行
$: 匹配正则表达式的结束行
\<: 从匹配正则表达 式的行开始
\>: 到匹配正则表达式的行结束
[ ]: 单个字符,如[A]即A符合要求
[ - ]: 范围,如[A-Z],即A、B、C一直到Z都符合要求
.: 所有的单个字符 *:有字符,长度可以为0
grep 查找使用 "" '' 双引号和单引号的区别是:
""双引号会将里面的字符串进行转义, '' 单引号不会转义
双引号 ""
name=hello
$grep -n "${name}" mkconfig/name.xml
grep “” 会将里面的${name} 进行转换转换为 hello 字符串,grep进行转义
单引号 ‘’
name=hello
$grep -n '${name}' mkconfig/name.xml
这里grep查找的就是 ${name} 不会进行转换,grep不会进行转义
grep查找过滤掉二进制文件,不显示匹配到的二进制文件,有三种方式:
1. -- binary-files=with-out 把二进制文件全部过滤掉
$ grep -rnwi "ARM" . --binary-files=without-match . 代表从当前路径开始向下递归查找
- -I 参数大写的 i
$ grep -rnwi -I "ARM" .
- 使用 --binary-files=text 缩小范围
$ grep --binary-files=text -nrwi "ARM" .
grep 同时满足多个字符串查找:
grep 字符串1 文件名| grep 字符串2|grep 字符串3|grep ...
中间使用管道 |
grep 满足多个关键字查找
参数: -E
grep -E "字符串1|字符串2|字符串3|" file_name
或者
egrep "字符串1|字符串2|字符串3|" file_name
grep 指令扩展
#!/bin/bash
name=$1
name_list="qiandazhuang lixiaohong caixiaoming wangliu"
is_name_list=$(grep -i "\b$name\b" <<< ${name_list})
echo "name:" ${name}
echo "name_list:" ${name_list}
echo "is_name_list:" ${is_name_list}
运行结果1:
$ ./grep_cmd.sh wangliu
name: wangliu
name_list: qiandazhuang lixiaohong caixiaoming wangliu
is_name_list: qiandazhuang lixiaohong caixiaoming wangliu
运行结果2:
$ ./grep_cmd.sh zhangsan
name: zhangsan
name_list: qiandazhuang lixiaohong caixiaoming wangliu
is_name_list:
运行结果1,当参数在${name_list}
内,输出的${is_name_list}
为本身,也就是说变量${is_name_list}
非空;
运行结果2,当参数不在${name_list}
内,输出的${is_name_list}
为空,变量${is_name_list}
为空;
可以利用输入参数是否在一个集合内部进行判断,选择不同的if 分支执行程序运行。