刚开始接触linux的时候,学了一大堆命令,由于并不是都能用到,很多命令都被抛在脑后,就连grep这个神器也一直被埋没着。今天复习命令时发现grep的几个妙用,开一贴记录一下。

常见用法如下:

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色 默认为红色

在网络编程中经常要用ifconfig看看ip地址是多少,然而一个ifconfig出来一大篇,找起来有点不方便(虽然看多了就习惯了)

今天发现配合grep可以是查看类的需求变的如此简单。

ifconfig | grep --color=auto inet

显示如下:

grep命令 空格 grep -wo_grep命令 空格

这个比起直接输入ifconfig已经清楚了很多,但是我只想看ipv4的地址,有没有办法在结果中再次筛选出ipv4的行呢?

我用到的是 字符类的反向选择符 [^]

grep命令 空格 grep -wo_grep命令 空格_02

ok,我的强迫症得到满足~


然而!我发现[^]还有别的用法!把 'inet[^6]' 改为 'inet[6^]' 后结果变成了如下:

grep命令 空格 grep -wo_基础命令_03

多次尝试后发现,如果将筛选值置于^前面,就会筛选出具有 包含关系 的结果。

刚刚是在inet后包含6,如果在检索串前面放置这种[arg^],能否筛选出包含关系的结果呢?

还是以ifconfig为例,在诸多的flags中检索。

grep命令 空格 grep -wo_linux_04

现在我拟定筛选串为 flags值为‘xx43’的行,也就是flags值包含43的。

grep命令 空格 grep -wo_linux_05

那么我想进一步筛选出结果中,前面包含‘9’的,也就是‘x943’的结果。

grep命令 空格 grep -wo_linux_06

从而验证出如果[arg^]这样的写法,不是剔除arg,而是包含arg。

grep命令 空格 grep -wo_grep_07

但是这样的写法是不规范的,如果想要包含直接写在串前即可,所以还是这样写[^arg],以达到剔除arg的效果。

[^]的用法总结:

string[^arg]     在筛选出string的结果中,剔除string之后有arg的结果。

[^arg]string     在筛选出string的结果中,剔除string之前有arg的结果。


关于[^]的用法还有几个细节问题,我认为这位大佬分析的很好。

 

grep命令 空格 grep -wo_grep命令 空格_08


定位行首与行尾字节 ^和 $

grep命令 空格 grep -wo_基础命令_09

'^arg'和'arg$' 分别为以arg开头,和以arg结尾

PS:可以用'^$'来检索空行

grep命令 空格 grep -wo_字符串_10


任意字节 .     重复字节 *

可以使用'ab..ef' 实现模糊检索

 

grep命令 空格 grep -wo_grep_11

用'0*0'搜索至少含有两个0的行。

grep命令 空格 grep -wo_linux_12

PS:骚操作之 搜索包含任意数字的行

grep命令 空格 grep -wo_字符串_13

同理可以实现字母的查找

grep命令 空格 grep -wo_字符串_14