Linux之grep 命令

Linux之grep 命令


1. grep 简介

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

命令格式:grep [option] pattern file;

正则表达式选择与解释:-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, --word-regexp         强制 PATTERN 仅完全匹配字词-x, --line-regexp         强制 PATTERN 仅完全匹配一行-z, --null-data           一个 0 字节的数据行,但不是空行Miscellaneous:-s, --no-messages         suppress error messages-v, --invert-match        select non-matching lines-V, --version             display version information and exit--help                display this help text and exit输出控制:-m, --max-count=NUM       NUM 次匹配后停止-b, --byte-offset         输出的同时打印字节偏移-n, --line-number         输出的同时打印行号--line-buffered       每行输出清空-H, --with-filename       为每一匹配项打印文件名-h, --no-filename         输出时不显示文件名前缀--label=LABEL         将LABEL 作为标准输入文件名前缀-o, --only-matching       show only the part of a line matching PATTERN-q, --quiet, --silent     suppress all normal output--binary-files=TYPE   assume that binary files are TYPE;TYPE is 'binary', 'text', or 'without-match'-a, --text                equivalent to --binary-files=text-I                        equivalent to --binary-files=without-match-d, --directories=ACTION  how to handle directories;ACTION is 'read', 'recurse', or 'skip'-D, --devices=ACTION      how to handle devices, FIFOs and sockets;ACTION is 'read' or 'skip'-r, --recursive           like --directories=recurse-R, --dereference-recursivelikewise, but follow all symlinks--include=FILE_PATTERNsearch only files that match FILE_PATTERN--exclude=FILE_PATTERNskip files and directories matching FILE_PATTERN--exclude-from=FILE   skip files matching any file pattern from FILE--exclude-dir=PATTERN directories that match PATTERN will be skipped.-L, --files-without-match print only names of FILEs containing no match-l, --files-with-matches  print only names of FILEs containing matches-c, --count               print only a count of matching lines per FILE-T, --initial-tab         make tabs line up (if needed)-Z, --null                print 0 byte after FILE name文件控制:-B, --before-context=NUM  打印以文本起始的NUM 行-A, --after-context=NUM   打印以文本结尾的NUM 行-C, --context=NUM         打印输出文本NUM 行-NUM                      same as --context=NUM--group-separator=SEP use SEP as a group separator--no-group-separator  use empty string as a group separator--color[=WHEN],--colour[=WHEN]       use markers to highlight the matching strings;WHEN is 'always', 'never', or 'auto'-U, --binary              do not strip CR characters at EOL (MSDOS/Windows)-u, --unix-byte-offsets   report offsets as if CRs were not there(MSDOS/Windows)grep的常用选项:-E: 解释PATTERN作为扩展正则表达式,也就相当于使用egrep匹配控制选项:
-e :  使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符( - )开头的图案。指定字符串做为查找文件内容的样式。  
-i :  搜索时候忽略大小写
-v:  反转匹配,选择没有被匹配到的内容。
-w:匹配整词,精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
-x:仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)一般输出控制选项:
-c: 抑制正常输出;而是为每个输入文件打印匹配线的计数。
-m num:当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容
-o: 只输出匹配的具体字符串,匹配行中其他内容不会输出
-q:安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-s:不会输出查找过程中出现的任何错误消息,-q和-s选项因为与其他系统的grep有兼容问题,shell脚本应该避免使用-q和-s,并且应该将标准和错误输出重定向到/dev/null 代替。
输出线前缀控制:
-b:输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)
-H:在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
-h:禁止输出上的文件名的前缀。无论查找几个文件都不会在匹配内容前输出文件名
-n:输出匹配内容的同时输出其所在行号。-A num:匹配到搜索到的行以及该行下面的num行
-B num:匹配到搜索到的行以及该行上面的num行
-C num:匹配到搜索到的行以及上下各num行

2. 使用实例:

1、查找指定进程

命令:ps -ef|grep java

2、查找指定进程个数

命令:ps -ef|grep -c java

3、从文件中读取关键词进行搜索,默认是显示的是行

命令1:cat test.txt | grep -f test2.txt

命令2(显示行号):cat test.txt | grep -nf test2.txt

作用:输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行,可用于按指定关键词(放到一个文件中)搜索日志文件。

-o:只显示被模式匹配到的字符串,而不是整个行

\# grep -o "root" /etc/passwd  #加o之后的操作,只过滤关键字出来
root
root
root
root
\# grep -o "root:.*0" /etc/passwd   #加上正则表达式,这样才是正确的用法,不用输出一整行,只是输出一小段
root:x:0:0
\# grep -o "root" -b  /etc/passwd  
-b和-o一般是配合使用的,一行中字符串的字符是从该行的第一个字符开始计算,起始值为0。这里左边的数字就是此关键字在此文件中的起始位置,第一个root出现在0位置,然后字符字母有一个算一个,你就一个个的向右数吧,下一个root出现在11位置以此类推。
0:root
11:root
17:root
414:root

4、从文件中查找关键词,忽略大小写,默认情况区分大小写

命令1:grep ‘linux’ test.txt

命令2(从多个文件中查找):grep ‘linux’ test.txt test2.txt

命令3(忽略大小写):grep -i ‘linux’ test.txt

命令:find . -name “.log” | grep -i error | grep -vi “info”

1)使用find -name 来列出所有log文件,重定向给grep
2)使用grep -i 来查找包含error的行
3)使用grep -vi 来查找不包含info的行

5、grep不显示本身

命令:

ps aux | grep ssh | grep -v “grep” #不包含grep ssh这条命令

grep -v root /etc/passwd | grep -v nologin #将/etc/passwd,将没有出现 root 和nologin的行取出来;

6、-r 递归查找子目录

查找当前目录及其子目录下面包含匹配字符的文件

# grep ‘ab’ * #在当前目录搜索带'ab'行的文件
# grep -r ‘ab’ *       #在当前目录及其子目录下搜索'ab'行的文件
# grep -l -r ‘ab’ *    #在当前目录及其子目录下搜索'ab'行的文件,但是不显示匹配的行,只显示匹配的文件
# grep -nr BLOG* .       # 查找子目录,匹配后输出行号,这里的点表示当前目录
# grep -lr  BLOG* .      #查找子目录,匹配后只输出文件名
查询不包含某个目录
#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search   #不包含txt目录 grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行egrep '123|abc' filename  // 用egrep同样可以实现awk '/123|abc/' filename  // awk 的实现方式;

7、与操作**

grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行;

8、-c 统计行数

grep -i "abc" test.txt|wc -l  #不分大小写。test.txt里面包含abc过滤条件的为2行
2
# grep -yc "abc" test.txt  #-c呢,就是不显示行的内容,直接显示有几行
# grep  -c "^.*$" /etc/passwd  #那么我们除了wc -l用来统一一个文件有多少行以外,又多了一种统计文件多少行的方法
55
# cat  /etc/passwd|wc -l 

9、 -m的使用

# grep -m 3 "abc" test2.txt  #只匹配到了第三行就退出了
abc 1
abc 2
abc 3

3. 与正则表达式结合**

grep的规则表达式:
\     反义字符:如"\"\""表示匹配""[ - ] 匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母* 所有字符,长度可为0+ 前面的字符出现了一次或者多次^  #匹配行的开始 如:'^grep'匹配所有以grep开头的行。    
$  #匹配行的结束 如:'grep$'匹配所有以grep结尾的行。    
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   #一起用代表任意字符。   
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。    
\<      #到匹配正则表达式的行开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      #到匹配正则表达式的行结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。  

2.1 常用命令

首与行尾字节 ^ $,^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!

$ ls -l | grep \'^a\'
$ ls -l | grep  ^a
$ ls -l | grep -v  \'^a\' #输出非a开头的行,反向选择
$ grep -n '^$' a.txt    #找出空白行,因为只有行首跟行尾 (^$)
$ grep \'test\' d*  #显示所有以d开头的文件中包含test的行。
$ cat test.txt |grep hat$ #输出以hat结尾的行内容
$ grep \'test\' aa bb cc #显示在aa,bb,cc文件中匹配test的行
$ grep \'[a-z]{5}\' aa
$ grep -n '[0-9]' regular_express.txt   #取得有数字的那一行
$ grep -n '^[a-z]' regular_express.txt    #只输出开头是小写字母的那一行
$ grep -n '^[^a-zA-Z]' regular_express.txt  #不输出开头是英文的
$ grep -n '\.$' regular_express.txt       #只输出行尾结束为小数点 (.) 的那一行 
#注意:小数点具有其他意义,所以必须要使用转义字符(\)来加以解除其特殊意义!
cat test.txt |grep -E "ed|at" #显示包含ed或者at字符的内容行
$ grep 'w(es)t.*\1' aa #如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(1),找到就显示该行
grep '[a-z]\{7\}' *.txt  #显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行

2.2 运维中常见的邮箱和IP地址的获取

这里用到了-o和-P命令
man grep查看
-o, --only-matching:
Show only the part of a matching line that matches PATTERN.
-P, --perl-regexp:
Interpret PATTERN as a Perl regular expression.

也就是说-o,只显示匹配行中匹配正则表达式的那部分,-P,作为Perl正则匹配

[root@cn01 test]# ip a|grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
192.168.10.11
192.168.10.255
grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
$ grep -n 'o\{2\}' regular_express.txt
$ grep -n 'go\{2,5\}g' regular_express.txt  #要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串
$ grep -n 'go\{2,\}g' regular_express.txt   #想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络趋势JSP介绍

JSP简介 JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术&#xff0c;它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag)&#xff0c;从而形成JSP文件(*.jsp)。 用J…

linux shell脚本批量创建公钥

linux shell脚本批量创建公钥 为实现对多台服务器部署服务&#xff0c;如果只用交互方式输入密码&#xff0c;耗时耗力&#xff0c;因此必须考虑自动化部署&#xff0c;查询资料发现expect方式可以实现。 一、介绍 expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务…

api与sdk

API/SDK API &#xff08;Application Programming Interface&#xff09;应用程序接口SDK&#xff08;Software Development Kit &#xff09;软件开发工具包api就是一个接口&#xff0c;指向应用程序&#xff0c;一般是通过这个接口能够获得这个应用程序的产生或者处理的数据…

MRI骨水肿是早期未分化关节炎演变为RA的独立预测预测因素

原文 译文 Arthritis & Rheumatism DOI: 10.1002/art.30396 MRI bone edema is an independent predictor of development of rheumatoid arthritis in patients with early undifferentiated arthritis 1. Anne Duer-Jensen MD1,*,†, 2. Kim Hrslev-…

linux之awk超详解

linux之awk详解 1、awk简介 awk是一种编程语言&#xff0c;用于linux下对文本和数据进行处理。数据可以来来自标准输入、一个或多个文件&#xff0c;或其他命令的输出。 更多作为脚本来使用。 awk处理数据的方式&#xff1a;逐行扫描文件&#xff0c;寻找匹配的特定模式的行…

Windows2003 企业版 + Sql Server2005手工调整数据库服务器内存

最近犯了一个大的错误&#xff0c;总以为Windows2003 能够合理的使用多余的内存&#xff0c;能够智能化处理内存&#xff0c;事实非然。事情是这样的&#xff0c;我有一台数据库服务器&#xff0c;32位&#xff0c;操作系统是Windows2003企业版&#xff0c;4G内存&#xff0c;3…

docker搭建postgresql 14主从库 及使用shell脚本备份数据库

docker搭建postgresql 14主从库 及使用shell脚本备份数据库 1、地址规划 IP地址名称备注192.168.1.11pg1主库192.168.1.21pg2从库 2、安装部署主库 [rootcn01 ~]# mkdir -p /data/postgressql/data [rootcn01 ~]# docker run --name pgtest --restartalways -v /data/postgr…

VC程序中运行其他程序的三种方法

有三个函数可以使用: WinExec, ShellExecute,CreateProcess 1.WinExec(String lpCmdLine,Long nCmdShow); 参数说明: 参数类型及说明lpCmdLineString&#xff0c;包含要执行的命令行nCmdShowLong&#xff0c;为窗口指定可视性方面的一个命令。请用下述任何一个常数SW_HIDE隐藏窗…

linux shell 判断主机三次存活之批量探测

linux shell 判断主机三次存活之批量探测 在生产环境中&#xff0c;需要查看主机在线情况&#xff0c;之前都是采用执行一次ping命令的方式去操作&#xff0c;会丢失某些存活主机&#xff0c;故改进了脚本采用ping三次的方式进行操作。 #for 语句 #&#xff01;/bin/bash ip_…

linux中单引号、双引号

linux中单引号与双引号的区别和用法 1、单引号 单引号定义为所见即所得&#xff0c;单引号内部的内容原样输出&#xff0c;被单引号引起来的内容不管时变量还是常量都不会发生替换 #在表示连续字符串时&#xff0c;单引号、双引号、无引号都是一样的 [rootcn21 ~]# str1&quo…

多媒体融合通信平台促进公网和专网的互联互通

在发生诸如地震、洪涝灾害以及极端天气的情况下&#xff0c;由于通信设施和电力设施最容易遭到破坏&#xff0c;因此&#xff0c;在进行应急救援时&#xff0c;相关指挥部门最先想到的就是进行相应设施的抢修。 公网抢修成功&#xff0c;所有相关抢险救灾者都可以实现互相通话&…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如&#xff1a;es6 想要系统学习&#xff1a; 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&…

Linux之shell中的大括号、中括号、小括号的使用详解

Linux之shell中的大括号、中括号、小括号的使用详解及示例 **摘要&#xff1a;**很多人和我一样对于shell的各种括号的各种用法肯定不是很清楚&#xff0c;有时候看见别人脚本都不知道是什么意思&#xff0c;今天就来说说bash中的大中小括号的用法和解释&#xff0c;本人常用b…

利用Visio 2007图形化项目进度和项目跟踪

课程类型 Microsoft Office Visio 2007 视频时长 120分钟 播放 课程资料 课程简介&#xff1a; 在进行项目管理时&#xff0c;项目经理将使用Microsoft Project对项目进行规划、资源分配、成本控制和项目状态跟踪。但是&#xff0c;项目中的数据如何能够通过更图形化的方式呈…

初学者看看PHP explode() 函数 第6篇

PHP explode() 函数 定义和用法 explode() 函数把字符串分割为数组。 语法 explode(separator,string,limit)参数 描述 separator 必需。规定在哪里分割字符串。 string 必需。要分割的字符串。 limit 可选。规定所返回的数组元素的最大数目。 说明 本函数返回由字符串组成的…

linux 备份文件滚动删除

linux 备份文件滚动删除 摘要&#xff1a;在实际的生产环境中&#xff0c;需要我们不断的备份文件&#xff0c;但是受到磁盘空间的影响&#xff0c;只能保留最新的备份文件。 1、只保存最近n天的文件 [rootcn01 test1]# ll 总用量 0 drwxr-xr-x 2 root root 6 2月 14 2020 …

jQuery常用方法总结(转)

jQuery 常见操作实现方式 $("标签名") //取html元素 document.getElementsByTagName("") $("#ID") //取单个控件document.getElementById("") $("div #ID") //取某个控件中 控件 $("#ID #ID") // 通过控件ID取其中…

K8s集群部署(最新版)

K8s集群部署&#xff08;最新版&#xff09; 1、部署k8s的两种方式&#xff1a; 本次实验采用kubeadm工具来部署Kubernetes集群。 Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、环境准备 服务器要求&a…

VRP 的发展

随着网络技术和应用的飞速发展&#xff0c;VRP 平台在处理机制、业务能力、产品支持等方面也在持续演进。由于平时也接触到了这几个版本的平台&#xff0c;也常不知道所以然&#xff0c;特找了些资料整理了一下。主要列举了VRP 发展历程中的几个主要版本。 VRP 发展历程 各版本…

Harbor私有仓库部署(最新)

Harbor私有仓库部署&#xff08;最新&#xff09; [rootK8s-Master ~]#yum install wget -y [rootK8s-Master ~]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo #docker-ce国内yum源 [rootK8s-Master ~]#yum -y…