shell grep指令详解
grep 参数:
-e : 使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符(- )开头的图案。指定字符串做为查找文件内容的样式
重要参数(查询排除指定文件夹,或者二进制文件):
–binary-file=without-match: 排除二进制文件查询。
上下文前后行匹配:
-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 分支执行程序运行。