grep 介绍

  • grep 系列是 Linux 中使用频率最高的文本查找命令。
  • 主要功能在一个或者多个文件中查找特定模式的字符串。如果该行有匹配的字符串,则输出整个行的内容。如果没有匹配的内容,则不输出任何内容。grep命令不改动源文件
  • Linux的grep家族包括grepegrepfgreprgrep
  • grep 可以通过 -G、-E、-F 命令行选项来使用 egrep 和 fgrep 的功能。
    • grep: 在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行
    • egrep: 扩展的egrep,支持更多的正则表达式元字符
    • fgrep: 固定grep(fixed grep),有时也被称作快速(fast grep),它按字面解释所有的字符

grep 命令格式

grep [选项] PATTERN filename filename ...
  • 在每个 FILE 或是标准输入中查找 PATTERN。
  • 默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。

grep 命令选项

FILE 文件控制    
-B --before-context=NUM 打印过滤关键字和上面NUM行
-A --after-context=NUM 打印过滤关键字和下面NUM行
-C --context=NUM 打印过滤关键字和上下NUM行
-NUM   等同 --context=NUM
  --color[=WHEN] --colour[=WHEN] 高亮颜色突出显示搜索的字符串。值’always’, ‘never’, or ‘auto’。
-U --binary 将文件作为二进制文件处理。仅有MS-DOS和MS-Windows支持该选项
-u --unix-byte-offsets 报告UNIX风格的字节偏移。这个选项仅在同时使用-b选项的情况下才有效;仅有MS-DOS和MS-Windows支持该选项
与 PATTERN 正则表达式相关的选项    
-E --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-F --fixed-strings PATTERN 是一组由断行符分隔的定长字符串
-G --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE)
-P --perl-regexp PATTERN 是一个 Perl 正则表达式
-e --regexp= PATTERN 用 PATTERN 来进行匹配操作
-f --file=FILE 从 FILE 中取得 PATTERN
-i --ignore-case 忽略大小写
-w --line-regexp 强制 PATTERN 仅完全匹配字词
-x --extended-regexp 强制 PATTERN 仅完全匹配一行
-z --null-data 一个 0 字节的数据行,但不是空行
输出控制选项    
-m --max-count=NUM 在找到指定数量的匹配行后停止读文件
-b --byte-offset 在显示符合样式的那一行之前,标示出该行第一个字符的编号
-n --line-number 在显示符合样式的那一行之前,标示出该行的列数编号
  --line-buffered 刷新输出的每一行
-H --with-filename 在显示符合样式的那一行之前,表示该行所属的文件名称
-h --no-filename 在显示符合样式的那一行之前,不标示该行所属的文件名称
  --label=LABEL 打印标签作为文件名的标准输入(主要用于管道处理) 例如:cat test |grep --label=test -H 123
-o --only-matching 仅输出匹配行的匹配部分
-q --quiet --silent 抑制所有正常输出
  --binary-files=TYPE 假定二进制文件为TYPE类型文件TYPE可以为binary、text或without-match
-a --text 等价于-binary-files=text
-I --binary-files=without-match 等价于–binary-files=without-match
-d --directories=ACTION 当grep的对象为目录时用,处理目录可以读取、递归或跳过
-D --devices=ACTION 当grep的对象为处理设备、栈或套接字时必须用,处理对象可以读取或跳过
-r -R --recursive --directories=recurse 相当于–directories=recurse 遍历目录
  --include=FILE_PATTERN 仅grep匹配的文件模式的文件
  --exclude=FILE_PATTERN 跳过匹配的文件模式的文件和目录进行grep匹配
  --exclude-from=FILE 跳过任一匹配文件模式的文件
  ---exclude-dir=PATTERN 跳过匹配的目录文件目录
-L --files-without-match 仅仅打印未匹配的文件的文件名
-l --files-with-matches 仅仅打印匹配的文件的文件名
-c --count 仅仅打印每个文件的匹配次数
-T --initial-tab 将标签排队(标签即文件名)
-Z --null 打印文件名,文件名与匹配行中间没有空字节 -z与-Z的区别之一:当一个文件有多个匹配行时-z只打印一次文件名,而-Z每匹配一次打印一次文件名
杂项    
-s --no-messages 不显示错误信息
-v --invert-match 打印不匹配的行

grep 实例

查找指定进程

ps -ef | grep kube-apiserver

root 6310 5764 0 14:34 pts/1 00:00:00 grep --color=auto kube-apiserver

这个结果是grep进程本身,并非真正要找的进程

查找指定进程个数

grep -c统计的进程个数,会包含了grep本身的进程

ps -ef | grep docker -c

先使用-v参数,排除grep自身的进程,再去过滤指定进程的个数

ps -ef | grep -v grep | grep docker -c

从文件中读取关键词进行搜索

先准备两个有内容的文件

cat <<EOF > test.txt
hello world
redhat
suse sle
centos
ubuntu
redhat
linux
EOF
cat <<EOF > test2.txt
linux
redhat
EOF

输出 test.txt 文件中含有从 test2.txt 文件中读取出的关键词的内容行

cat test.txt | grep -f test2.txt

显示行号(关键字在文本内的行数)的话,加上-n参数即可

cat test.txt | grep -nf test2.txt

从多个文件中查找关键字

grep linux test.txt test2.txt

输出以u开头的行

grep "^u" test.txt

输出非u开头的行

grep -v "^u" test.txt
grep ^[^u] test.txt

输出以hat结尾的行

grep "hat$" test.txt

输出se或者ed字符的行

egrep "se|ed" test.txt

使用方括号表达式匹配括号内的任一字符

ps -ef | grep [do]cker

匹配一个范围内的任一字符

grep [a-z]c /etc/passwd

这里表示匹配一个小写字母的字符后面接一个字符 c 的字符串

结合 ^ 字符使用,表示取反

^ 放在方括号里面表示反向含义

^ 放在方括号外面则表示的是匹配行首

grep [^a-z]c /etc/passwd

这里表示匹配一个非小写字母的字符后接一个字符 c 的字符串

使用 {n.m} 区间表达式来匹配指定的次数

  • {n,m}表示匹配在其前面的字符 n 到 m次,
  • {n,} 表示至少匹配 n 次
  • {,m} 表示最多匹配 m 次
  • {n} 表示是精准匹配 n 次
  • 在 BRE 中,使用的是 {n,m} 的形式来实现相同的功能。
  • n 与 m 的值必须介于 0 至 RE_DUP_MAX(包含这个值)之间,后者的最小值为255
egrep 5{2} /etc/passwd

匹配/etc/passwd文件中,一行内5连续出现了2次的行

使用 ( ) 保存已匹配的字符

  • 使用 ( ) 会先匹配括号中的字符串,然后将匹配到的字符串保存在由正则表达式解析器预定义好的叫做寄存器的变量中,其编号从1到9,也就是说最多可以保存9组字符串,使用 \n 可以取出所保存的字符串,其中 n1到9,分别对应9个寄存器的值
ifconfig eth0 | egrep '([0-9]{,3}\.){3}[0-9]'

匹配一个行首字符和行尾字符相同的字符串

egrep '^(.).*\1$' test.txt
义好的叫做寄存器的变量中,其编号从1到9,也就是说最多可以保存9组字符串,使用 `\n` 可以取出所保存的字符串,其中 `n` 为`1到9`,分别`对应9个寄存器的值`。 ```shell
ifconfig eth0 | egrep '([0-9]{,3}\.){3}[0-9]'

我们一起来学grep的更多相关文章

  1. sort命令的使用,结合uniq, awk等

    这条命令的意思:lastb | awk -F " " '{print $3}' | sort | uniq -c | sort -k1,1nr > output.log 过滤 ...

  2. 菜鸟学Linux命令:grep配合ls等使用

    linux grep命令 (global search regular expression(RE) and print out the line )是一种强大的文本搜索工具,它能使用正则表达式搜索文 ...

  3. 每天学点Linux-选取命令CUT和GREP

    选取命令就是将一段数据经过分析后,取出我们所想要的.或者是经由分析关键词,取得我们所想要的那一行!一般来说,选取命令通常是针对一行一行的数据来进行分析的, 并不是整篇信息分析.cut cut命令可以将 ...

  4. 每天学点Linux命令之grep 和 wc命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  5. 每天学点Linux命令之grep 和 wc命令 ---(6/25)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  6. 每天学点Linux命令之grep 和 wc命令 --- !管道命令!

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  7. 『学了就忘』Linux基础命令 — 31、grep命令和通配符

    目录 1.grep命令介绍 2.find命令和grep命令的区别(重点) (1)find命令 (2)grep命令 3.通配符与正则表达式的区别 (1)通配符: (2)正则表达式: 1.grep命令介绍 ...

  8. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  9. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

随机推荐

  1. Cookie.Session到Token和JWT

    一.session和cookie: 现在一般都是session和cookie一起用,一起提.但是他们俩其实不是一定要在一起. session的产生原因是,http协议是无状态的 这就导致了,不同的用户 ...

  2. SYCOJ27猴子选大王

    题目-猴子选大王 (shiyancang.cn) 一.出队顺序Description有M个人,其编号分别为1-M.这M个人按顺序排成一个圈.现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然 ...

  3. HDU 1576 A/B (两种解法)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 分析:等式枚举法,由题意可得:, ,代入 ,    得:,把变量 合在一起得: :即满足 为 倍 ...

  4. TestNG中 ITestListener 的使用

    1.关于testng中ITestListener 的相关介绍文档,请参考: http://javadox.com/org.testng/testng/6.8.7/org/testng/ITestLis ...

  5. Centos7安装erlang以及RabbitMQ Centos启动rabbitmq

    本文使用版本:  rabbitmq-server-3.8.3-1.el7.noarch.rpm   Centos7  erlang  22.3.1 在线安装 yum install esl-erlan ...

  6. 【记录一个问题】android opencl c++: 不要Context, CommandQueue类的赋值函数

    一开始代码中这样写了: cl::Context ctx = cl::Context(CL_DEVICE_TYPE_GPU, NULL); cl::CommandQueue queue= cl::Com ...

  7. 【记录一个问题】ndk下使用c++11的condition_variable问题较多

    1.存在通知丢失的情况:生产者线程通知196次,消费者线程收到190次,导致部分数据无法被处理. 2.cond.wait()方法后的加锁有问题,导致对空队列进行出队操作然后coredump.一直记得w ...

  8. 一次神奇的Azure speech to text rest api之旅

    错误Max retries exceeded with url: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='%20e ...

  9. JS基础语法(二)

    目录 JavaScript基础语法(二) 八. 函数 1. 函数的概念 2. 函数的使用 声明函数 调用函数 3. 函数的封装 4. 函数的参数 函数的参数匹配问题 5. 函数返回值 6. argum ...

  10. 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?

    云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜? Kubernetes 可以为做些什么? 在学习一种新技能之前,囧囧建议不要上去先看各种牛叉的实现,我们需要先搞清楚这个技能是什么?学习了之后能为我 ...