linux grep 学习笔记

    xiaoxiao2023-03-24  2

    1. grep简介

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。

    linux使用GNU版本的grep。它功能 更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

    egrep就等同于grep -E ,fgrep等同于grep -F

     

    grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

     

    grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

     

    -n: 输出行号

    -i: 忽略大小写

    -v: 反向搜索,显示不包含字符串的内容

    -l: 查询多个文件,只输出包含匹配字符串的文件名称

    -L: 查询不匹配的文件名

    -c:只输出匹配行的计数。

     

    二、grep使用 例子

     

    #显示在aa,bb,cc文件中匹配test的行。

    $ grep 'test' aa bb cc

     

    #忽略大小写 

    more size.txt | grep -i 'b1..*3'  

    b124230 

    b103303 

    B103303 

     

    #显示/etc/passwd文件包含root的行内容,显示行好,不区分大小写

    grep -ni Root /etc/passwd

     

    #查询/etc/passwd文件中不包含root的行内容

    grep -v root /etc/passwd

     

    #显示所有以d开头的文件中包含 test的行。

    [root@eccs_web_bak]#:grep '^root' /etc/passwd

    root:x:0:0:root:/root:/bin/bash

     

    #单个字符匹配

    more size.txt | grep 'b' 

     

    行匹配:输出匹配行的计数

    grep -c "48" data.doc   #输出文档中含有48字符的行数

     

    3、根据条件搜索文件

    #在当前目录搜索带root行的文件

    grep 'root' *

     

    #在当前目录及其子目录下搜索root的行文件

    grep -r 'root' *

     

    #在当前目录及其子目录下搜索root的行文件,但是不显示匹配的行,只是显示文件名称

    grep -r -l 'root' *

     

    4、正则表达式

    [^]

    匹配一个不在指定范围内的字符,如:\'[^A-FH-Z]rep\'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

    (..)

    标记匹配字符,如\'(love)\',love被标记为1。

    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的行。

     

    查询file_name文件中包含s与t字母之间包含三个字符的行

    grep  s...t file_name

     

    查找文件file_name中包含“*”字符的行

    grep \* filename

     

    匹配包含单词“abc”的行,全词匹配

    grep "\<abc\>" file_name

     

    #显示包含test 或者 tast的行号的内容

    grep -n 't[ae]st' /home/huangbiao.txt

     

    #显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

    $ grep '[a-z]\{5,\}' aa

     

    #不匹配行首是48的行

    grep '^[^48]' data.doc  

    备注:^在[]内代表【反向选择】,在[]外则代表定义在首

     

    #匹配正则表达式的开始行

    grep '^root' /etc/group  

    root::0:root 

     

    #匹配root结束行 

    grep 'root$' /etc/group  

    root::0:root 

    mail::6:root 

     

    #找出空白行

    grep -n '^$' /home/abc.txt

     

    如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

     

    5、扩展grep(egrep 或者 grep -E)

    egrep 'huang|liu' /home/test.text

    =grep -e 'huang|liu' /home/test.text

    =grep 'huang\|liu' /home/test.text

    转载请注明原文地址: https://ju.6miu.com/read-1200044.html
    最新回复(0)