网站首页

玩转Linux命令之三剑客,grep命令详解

30 8月 , 2019  

玩转Linux命令之三剑客

grep(Global search Regular Expression and Print out the
line)是一种强大的文本搜索工具,
它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族还包括egrep(Ext)和fgrep(Fixed)。

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

1 grep命令

功能说明
grep(Global Regular Expression
Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。其格式如下
grep[选项]pattern file

grep命令的选项及其说明如下

选项 说明
-v 过滤指定字符串内容的行
-i 不区分大小写
-E 过滤多个字符串
-o 输出多个精确匹配的字符,而不是整行

使用案例

[[email protected] data]# vim teach.txt #创建测试数据(编辑测试数据内容)
Program language
Java
C
C++
PHP
Python
Ruby

OS
Windows
windows
Linux
Mac
Unix
Android
IOS

过滤掉指定的字符串(“windows”)匹配的行并忽略大小写后将结果输出

[[email protected] data]# grep -vi 'windows' teach.txt #忽略大小写并过滤包含Windows字符串的行

Program language
Java
C
C++
PHP
Python
Ruby

OS
Linux
Mac
Unix
Android
IOS

过滤掉多个匹配字符串内容(‘Android|IOS’)的行并将结果输出

[[email protected] data]# grep -vE 'Android|IOS' teach.txt  #过滤Android和IOS字符串对应的行

Program language
Java
C
C++
PHP
Python
Ruby

OS
Windows
windows
Linux
Mac
Unix

查找指定的进程

[[email protected] data]$ ps -ef|grep ssh #查找SSH远程加密连接的进程
root       1403      1  0 09:54 ?        00:00:00 /usr/sbin/sshd
root       1509   1403  0 10:00 ?        00:00:00 sshd: guanglei [priv]
guanglei   1511   1509  0 10:00 ?        00:00:00 sshd: [email protected]/1
guanglei   1654   1512  0 10:21 pts/1    00:00:00 grep ssh

grep使用的正则表达式元字符:

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

2 sed命令

功能说明 sed主要用来编辑文件,简化对文件的反复操作,编写转换程序等,擅长取行。其格式如下 sed [选项] [n1,[n2]][function],n1,n2表示选择行数的区间

选项 说明
-n 取消默认输出
-i 改变文件内容

fuction: d:删除 i:插入 p:打印 s:替换

使用案例

查找匹配字符串内容的行

[[email protected] data]# sed -n '/J/p' teach.txt  #匹配指定字符串的行   
Java

删除匹配字符串内容的行

[[email protected] data]# sed -i '/Python/d' teach.txt        
[[email protected] data]# cat teach.txt 

Program language
Java
C
C++
PHP
Ruby

OS
Windows
windows
Linux
Mac
Unix
Android
IOS
[[email protected] data]# 

实现文件内容的替换

[[email protected] data]# sed -i 's#Android#android6.0#g' teach.txt  #将Android替换成Android6.0
[[email protected] data]# cat teach.txt 

Program language
Java
C
C++
PHP
Ruby

OS
Windows
windows
Linux
Mac
Unix
android6.0
IOS

实现指定文件内容的查找并替换

[[email protected] data]# mkdir -p  grandparent/parent/son #创建三级目录
[[email protected] data]# tree #查看目录树结构
.
├── grandparent
│   ├── parent
│   │   ├── son
│   │   │   └── test.txt
│   │   └── test.txt
│   └── test.txt
└── teach.txt
[[email protected] data]# echo "This is Linux Operator System" >grandparent/test.txt #创建测试数据
[[email protected] data]#  echo "This is Linux Operator System" >grandparent/parent/test.txt
[[email protected] data]#  echo "This is Linux Operator System" >grandparent/parent/son/test.txt

[[email protected] data]# find ./ -type f -name "test.txt"|xargs sed -i 's#Linux#Unix#g' #将匹配的文件内容字符串转换为Unix

[[email protected] data]# cat grandparent/test.txt #查看修改结果
This is Unix Operator System

获取指定区间行数的内容

[[email protected] data]# sed -n '2,5p' teach.txt 
Program language
Java
C
C++

 

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,
fgrep就是fixed grep或fast
grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

3 awk命令

awk是一种程序设计语言,允许创建简短的程序,这些程序读取输入文件,为数据排序,处理数据,对输入执行计算以及生成报表。其格式如下

awk ‘{pattern +action}’ {fileNames}

选项 说明
-F 指定分割的内容

内置变量 NR: 表示行号

使用案例

使用awk实现获取指定区间的内容

[[email protected] data]# awk '{if(NR<5&&NR>=2)printf $1 "\n"}' teach.txt  
Program
Java
C

1 grep命令 功能说明
grep(Global Regular Expression
Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配…

元字符 功能 示例 匹配对象
^ 行首定位符 ‘^simaopig%’ 匹配所有以simaopig开头的行
$ 行尾定位符 ‘simaopig$’ 匹配所有以simaopig结尾的行
. 匹配任意一个字符 ‘s.m’ 匹配包含一个s字符,后面跟一个字符(随意),再跟一个m的行
* 匹配0或多个前一字符 ‘s*m’ 匹配包含零个或多个s字符,后面跟有一个m字符的行
[] 匹配一组字符中的任意一个 ‘[Ss]imaopig’ 匹配simaopig,或者Simaopig
[^] 匹配不在指定字符组内的字符 ‘[^a-z]imaopig’ 匹配不包含在a-z之间的字符后跟着imaopig的行,即所有aimaopig-zimaopig的行都不包含(有点绕)
\< 词首定位符 ‘\<simaopig’ 匹配以simaopig为开头的词的行,simaopigabcd也是可以的
\> 词尾定位符 ‘simaopig\>’ 匹配以simaopig为结尾的词的行,abcdsimaopig也是可以的
.. 标记匹配的字符 ‘simaopig’s blog’ 标记寄存器里的一段字符,该寄存器被记作1号寄存器。以后引用这段字符时,可以使用\1来重复该模式。9个标签中最左边的是第一号。例如,模式simaopig被保存在1号寄存器里,之后用\1来引用它。
x\{m\}或x\{m,\}或x\{m,n\} 字符x的重复出现 ‘s\{5\}’,’s\{5,\}’,’s\{5,10\}’ 匹配连续出现5个s、至少5个s或5到10个s的行

文件字符搜索

grep能够快速的对文件进行搜索,命令和参数都比较好理解:

grep [-acinv] [--color=auto] '搜寻字符串' filename

选项与参数:

  • -a :将 binary 文件以 text 文件的方式搜寻数据
  • -c :计算找到 ‘搜寻字符串’ 的次数
  • -i :忽略大小写的不同,所以大小写视为相同
  • -n :顺便输出行号
  • -v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
  • –color=auto :可以将找到的关键词部分加上颜色的显示喔!

为了方便使用这个命令,先建立一个用来测试的文件,文件的内容如下:

The Wrong Man
1956 film by Alfred Hitchcock
The Wrong Man is typical of most of his films. In The Wrong Man he appears only in silhouette, just before the credits at the beginning of the film, where he tells a darkened studio that the story is true.

搜索含有Man的句子:

root@ubuntu:~# grep -n Man  grep_text.txt 
1:The Wrong Man
3:The Wrong Man is typical of most of his films. In The Wrong Man he appears only in silhouette, just before the credits at the beginning of the film, where he tells a darkened studio that the story is true.

其中 -n 为显示出有搜索到的句子在第几行。其他的参数同样可以使用如:

root@ubuntu:~# grep -n -i -v Man  grep_text.txt 
2:1956 film by Alfred Hitchcock 
4:

可以对照上面对参数的说明,-n -i -v ,其中-v是显示搜索不到的行数。

 

作为命令的管道进行搜索

在linux的命令中,有些命令显示了大量的内容,不容易查看可以通过grep过滤,得到想要的结果,如命令ps
ax 显示了大量的,使用grep过滤相关进程。

    root@ubuntu:~# ps ax | grep -n python
149:  5574 pts/0    Tl     0:00 /usr/bin/python /usr/local/bin/scrapy crawl iiSpider
150:  5589 pts/0    T      0:00 /usr/bin/python /usr/local/bin/scrapy crawl ccSpider
151:  5714 pts/0    T      0:00 /usr/bin/python /usr/local/bin/scrapy crawl ddSpider

grep的选项:

正则匹配

grep的正则跟其他语言的正则表达式有一些不同,认识到grep里的规则,就能容易写出grep的过滤条件。

RE(正则表达式)

  • ^ 匹配正则表达式的开始行
  • $ 匹配正则表达式的结束行
  • < 从匹配正则表达式的行开始
  • > 到匹配正则表达式的行结束
  • [ ] 单个字符;如[A] 即A符合要求
  • [ – ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
  • . 所有的单个字符
    • 所有字符,长度可以为0
  •  忽略正则表达式中特殊字符的原有含义

查看带数字的行:

root@ubuntu:~# grep -n [0-9]  grep_text.txt 
2:1956 film by Alfred Hitchcock 

查看The开头的行

root@ubuntu:~# grep -n ^The  grep_text.txt 
1:The Wrong Man
3:The Wrong Man is typical of most of his films. In The Wrong Man he appears only in silhouette, just before the credits at the beginning of the film, where he tells a darkened studio that the story is true.

更多教程:阿猫学编程

 

选项 功能
-b 在每一行前面加上其所在的块号,根据上下文定位磁盘块时可能会用到
-c 显示匹配到的行的数目,而不是显示行的内容
-h 不显示文件名
-i 比较字符时忽略大小写的区别
-l(小写的字母L) 只列出匹配行所在文件的文件名(每个文件名只列一次),文件名之间用换行符分隔
-n 在每一行前面加上它在文件中的相对行号
-s 无声操作,即只显示报错信息,用于检查退出状态
-v 反向查找,只显示不匹配的行
-w 把表达式作为词来查找,就好像它被\<和\>夹着那样。只适用于grep(并非所有版本的grep都支持这一功能,譬如,SCO UNIX就不支持)

 

更多参见:
grep
正则表达式及选项以及注意
grep用法详解:grep与正则表达式

 

原文:


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图