刚开始接触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
显示如下:
这个比起直接输入ifconfig已经清楚了很多,但是我只想看ipv4的地址,有没有办法在结果中再次筛选出ipv4的行呢?
我用到的是 字符类的反向选择符 [^]
ok,我的强迫症得到满足~
然而!我发现[^]还有别的用法!把 'inet[^6]' 改为 'inet[6^]' 后结果变成了如下:
多次尝试后发现,如果将筛选值置于^前面,就会筛选出具有 包含关系 的结果。
刚刚是在inet后包含6,如果在检索串前面放置这种[arg^],能否筛选出包含关系的结果呢?
还是以ifconfig为例,在诸多的flags中检索。
现在我拟定筛选串为 flags值为‘xx43’的行,也就是flags值包含43的。
那么我想进一步筛选出结果中,前面包含‘9’的,也就是‘x943’的结果。
从而验证出如果[arg^]这样的写法,不是剔除arg,而是包含arg。
但是这样的写法是不规范的,如果想要包含直接写在串前即可,所以还是这样写[^arg],以达到剔除arg的效果。
[^]的用法总结:
string[^arg] 在筛选出string的结果中,剔除string之后有arg的结果。
[^arg]string 在筛选出string的结果中,剔除string之前有arg的结果。
关于[^]的用法还有几个细节问题,我认为这位大佬分析的很好。
定位行首与行尾字节 ^和 $
'^arg'和'arg$' 分别为以arg开头,和以arg结尾
PS:可以用'^$'来检索空行
任意字节 . 重复字节 *
可以使用'ab..ef' 实现模糊检索
用'0*0'搜索至少含有两个0的行。
PS:骚操作之 搜索包含任意数字的行
同理可以实现字母的查找