请选择 进入手机版 | 继续访问电脑版

[LINUX] 举例讲解Linux下grep下令 的出色 使用 技巧

[复制链接]
查看108 | 回复4 | 2021-9-4 21:40:30 | 显示全部楼层 |阅读模式

grep 下令 用来搜索 文本,或从给定的文件中搜索 行内包含了给定字符串或单词的文件。通常来说,grep 表现 匹配到的行。利用 grep 来搜索 包括一个或多个正则表达式匹配到的文本行,然后只表现 匹配到的行。grep 被视作在 Linux/ Unix 体系 中最有效 的下令 之一。

grep 这个名字,泉源 于一个 Unix/Linux 中的古老的行编辑器 ed 中实行 相似操作的下令 :

复制代码代码如下:
g/re/p

grep 下令 的语法

语法如下所示:

grep 'word' 文件名
grep 'word' 文件1 文件2 文件3
grep '字符串1 字符串2'  文件名
cat 某个文件 | grep '某个东西'
command | grep '某个东西'
command 选项1 | grep '数据'
grep --color '数据' 文件名
怎么样利用 grep 来搜索 一个文件

搜索 /etc/passwd 文件下的 boo 用户,输入:

复制代码代码如下:
$ grep boo /etc/passwd

输出内容:

复制代码代码如下:
foo:x:1000:1000:foo,,,:/home/foo:/bin/ksh

可以利用 grep 去逼迫 忽略大小写。比方 ,利用 -i 选项可以匹配 boo, Boo, BOO 和其他组合:

复制代码代码如下:
$ grep -i "boo" /etc/passwd

递归利用 grep

你可以递归地利用 grep 举行 搜索 。比方 ,在文件目次 下面搜索 全部 包含字符串“192.168.1.5”的文件

复制代码代码如下:
$ grep -r "192.168.1.5" /etc/

或者是:

复制代码代码如下:
$ grep -R "192.168.1.5" /etc/

示例输出:

复制代码代码如下:
/etc/ppp/options:# ms-wins 192.168.1.50
/etc/ppp/options:# ms-wins 192.168.1.51
/etc/NetworkManager/system-connections/Wired connection 1:addresses1=192.168.1.5;24;192.168.1.2;

你会看到搜索 到 192.168.1.5 的效果 每一行都前缀以找到匹配的文件名(比方 :/etc/ppp/options)。输出之中包含的文件名可以加 -h 选项来克制 输出:

复制代码代码如下:
$ grep -h -R "192.168.1.5" /etc/

或者

复制代码代码如下:
$ grep -hR "192.168.1.5" /etc/

示例输出:

复制代码代码如下:
# ms-wins 192.168.1.50
# ms-wins 192.168.1.51
addresses1=192.168.1.5;24;192.168.1.2;

利用 grep 去搜索 文本

当你搜索 boo 时,grep 下令 将会匹配 fooboo,boo123, barfoo35 和其他全部 包含 boo 的字符串,你可以利用 -w 选项去逼迫 只输出那些仅仅包含谁人 整个单词的行(LCTT译注:即该字符串两侧是英文单词分隔符,如空格,标点符号,和末了 等,因此对中文这种没有断字符号的语言并不实用 。)。

复制代码代码如下:
$ grep -w "boo" file

利用 grep 下令 去搜索 两个不同的单词

利用 egrep 下令 如下:

复制代码代码如下:
$ egrep -w 'word1|word2' /path/to/file

(注:这里利用 到了正则表达式,因此利用 的是 egrep 下令 ,即扩展的 grep 下令 。)

统计文本匹配到的行数

grep 下令 可以通过加 -c 参数表现 每个文件中匹配到的次数:

复制代码代码如下:
$ grep -c 'word' /path/to/file

传递 -n 选项可以输出的行前加入匹配到的行的行号:

复制代码代码如下:
$ grep -n 'root' /etc/passwd

示例输出:

复制代码代码如下:
1:root:x:0:0:root:/root:/bin/bash
1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh
3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh

反转匹配(不匹配)

可以利用 -v 选项来输出不包含匹配项的内容,输出内容仅仅包含那些不含给定单词的行,比方 输出全部 不包含 bar 单词的行:

复制代码代码如下:
$ grep -v bar /path/to/file

UNIX/Linux 管道与 grep 下令

grep 常常与管道一起利用 ,在这个例子中,表现 硬盘装备 的名字:

复制代码代码如下:
# dmesg | egrep '(s|h)d[a-z]'

表现 CPU 型号:

复制代码代码如下:
# cat /proc/cpuinfo | grep -i 'Model'

然而,以上下令 也可以按照以下方法利用 ,不利用 管道:

复制代码代码如下:
# grep -i 'Model' /proc/cpuinfo

示例输出:

复制代码代码如下:
model : 30
model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz
model : 30
model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz

怎样 仅仅表现 匹配到内容的文件名字?

利用 -l 选项去表现 那些文件内容中包含 main() 的文件名:

复制代码代码如下:
$ grep -l 'main' *.c

末了 ,你可以逼迫 grep 以彩色输出:

复制代码代码如下:
$ grep --color vivek /etc/passwd

示例输出:

2016125115243850.png (598×98)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar ty实话实说2017 | 2021-9-18 08:04:44 | 显示全部楼层
白富美?高富帅?
回复

使用道具 举报

avatar 晚景入寒窗 | 2021-9-19 08:02:31 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

avatar 子非鱼JXX | 2021-10-4 04:54:30 | 显示全部楼层
我默默的回帖,从不声张!
回复

使用道具 举报

avatar 却写杂布计 | 2021-10-15 22:45:02 | 显示全部楼层
admin楼主的帖子越来越有深度了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则