grep指令详解

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     .  代表从当前路径开始向下递归查找
  1. -I 参数大写的 i
$ grep -rnwi  -I "ARM" . 
  1. 使用 --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 分支执行程序运行。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值