Linux13--文本处理之:grep命令、正则表达式

0 随堂测验

# 1.查询etc目录下以ifcfg开头的文件
    find /etc/ -name 'ifcfg*'

# 2.将/etc/yum.repos.d/目录下所有的.repo文件备份到/tmp下
    find /etc/yum.repos.d/ -name '*.repo' -exec cp /tmp \;

# 3.将/etc/下所有的目录复制到/tmp下
    find /etc/ -type d | xargs -I {} cp -r {} /tmp/

# 4.将/etc下所有的普通文件打包压缩到/tmp目录下
    tar -zcvf /tmp/etc.tar.gz $(find /etc/ -type f | xargs)

# 5.find命令中的并且和或者
    -a 
    -o

# 6.同上述第4题,将其打包压缩的文件解压至/mnt目录中
    tar -xf /tmp/etc.tar.gz  -C /mnt/

1 Linux三剑客之grep

# 1.grep命令的作用及使用场景
    grep命令一般用来筛选我们需要的数据,过滤内容
    
    # 格式:
      grep [参数] [过滤规则] [路径]
      
      标准输出 | grep [参数] [过滤规则]
     
# 2.grep命令的参数
参数:
    -n:显示匹配行及行号   ***
    -o:只输出匹配的内容
    
    -q:静默输出 不输出匹配结果  
    # 一般用在shell脚本中,然后用 echo $? 查看命令执行结果 0:匹配到,非0:未匹配到
    
    -i:忽略大小写  # 只适用于单字符
    -c:显示匹配到的行数  # 注意不是匹配到次数
    -v:反向查找  # 显示不包含匹配文本的所有行  ***** 
    
    -w:匹配某个词 # 词:一连串字母和数字组成的字符串
    
    -E:使用扩展正则  # 简写:egrep
    
    -R:递归过滤  # 跟随符号链接   ***** 
         -R, -r, --recursive   递归过滤
    
    -l:只输出匹配到的文件名路径  # 如果匹配成功,只打印文件名   ***
        通常-rl一起用,grep -rl 'root' /etc

    -L:只输出未匹配到的文件名路径  
    
    -s:不显示 不存在或无匹配文本的错误信息
    
    -e:指定匹配规则,可指定多次,实现 or 的效果,# 默认 基本正则模式
        可通过在首个 -e 前指定 -E, -G, -F切换正则匹配模式
        # grep -E -e "th.{2}" -e "th.{3}" roc.txt
        # grep -F -e "^this" -e '^$this' roc.txt
    
    -f: 指定一个文件,可指定多次,里面包含了匹配的规则,一行一个规则
    	# 相当于把 -e 指定的模式写入了文件
        # 也可以指定 -E, -G, -F切换模式
     
     
扩展参数:
    -A:显示匹配到的数据及后n行
    -B:显示匹配到的数据及前n行
    -C:显示匹配到的数据及前后n行
  
# 补充:
    $?:代表上一次命令执行是否成功(0代表成功,非0代表失败)
    wc-l:打印显示有多少行(统计行)
    
# 3.grep命令和正则表达式的结合

grep  -n '/bin/bash' /etc/passwd

grep 案例

# 0.过滤相关的进程     ****** 
   注:去掉grep color 进程的干扰   将 首字母加[]  eg:[n]ginx
    ps aux | grep "[n]ginx"

    ps aux | grep "nginx"  |  grep -v grep

    # 查看 和 ps aux | grep nginx  的区别,会带着 grep --color==auto nginx 的干扰


# 1.要求过滤出/etc/passwd中包含的root的行及其行号
    grep -n "root" /etc/passwd
   
# 2.要求过滤出/etc/passwd中包含的root的行,只显示过滤到的内容
    grep -o "root" /etc/passwd
   
# 3.要求过滤/etc/passwd中的Root,忽略大小写
    grep -i "Root" /etc/passwd
   
# 4.要求匹配mail及其后两行
    grep -n -A 2 "mail" /etc/passwd
   
# 5.要求匹配mail及其前两行
    grep -n -B 2 "mail" /etc/passwd
   
# 6.要求匹配mail及其前后各两行
    grep -n -C 2 "mail" /etc/passwd
   
# 7.要求显示包含root的行有多少行
    grep -c "root" /etc/passwd 
   
# 8.要求查询不包含root的行
    grep -v "root" /etc/passwd
    
# 9.匹配tian这个词
    cat 1.txt
        befggfnb 
        vtiandsgrt
        tiandfbx
        tiantian
        hetiantian
        tiantianhe
        2353475
        546554
        tian
        
    grep -w "tian" 1.txt
        tian
    
# 10.要求匹配出包含tian的行
    grep "yang" 1.txt
    或者
    grep -E "(tian)+" 1.txt
        vtiandsgrt
        tiandfbx
        tiantian
        hetiantian
        tiantianhe
        tian
    
# 11.要求找出/etc目录下,那些文件中包含root
    grep -R "root" /etc
    
    	# R:递归查询
        # l:只打印文件路径
    grep -Rl "root" /etc/
	
# 12.静默输出
    grep -q "root" /etc/passwd
    echo $? 
    
				
# 13.计算/etc目录下包含root的文件有多少个?
    grep -R -l "root" /etc | wc -l 
      
# 14.查询/etc/passwd文件中包含/bin/bash的行并输出行号
    grep -n "/bin/bash" /etc/passwd
      
# 15.过滤出当前主机包含的IP
    ip a | grep -o -E "([0-9]{1,3}\.){3}([0-9]){1,3}"
        127.0.0.1
        192.168.15.110
        192.168.15.255
        172.22.0.110
        172.22.15.255

2 正则表达式

# 正则表达式是通过包含特殊含义的一些字符去适配各种匹配场景,从而匹配出我们想要的结果。

# 正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。

1.普通正则表达式

*    匹配前一个字符(连续出现)0或者1次以上 
.    点号,表示匹配任意一个且只有一个字符 # 但是不能匹配换行符
^    尖角号,用法为^oldboy.表示匹配以oldboy单词开头的行
$    美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行
\    转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点

[]   或者(其中包含的所有的字符的或者)
[^]  取反 

[A-Z]  匹配[]内任意一个字符,A-Z中的任意一个
[a-z]  匹配[]内任意一个字符,a-z中的任意一个
[0-9]  匹配[]内任意一个字符,0-9中的任意一个
[^abc] 匹配不包含^后的任意字符,这里的^表示对[abc]取反

 
# 组合:
.*   组合符,匹配所有的内容
^.*  组合符,匹配以任意多个字符开头的内容
^$   组合符,表示空行,逻辑解释就是以^结尾的行,或以$开头的行
.*$  组合符,以任意多个字符结尾的内容

普通正则案例

# 1.匹配包含22的行
    grep "22.*" 1.txt
    grep "222*" 1.txt

      
# 2.以3结尾的行
    grep  "3$" 1.txt
    
# 3.要求输出包含eth的行
    grep "eth." 2.txt 
        /etc/sysconfig/network-scripts/ifcfg-eth1
        /etc/sysconfig/network-scripts/ifcfg-eth0
        /etc/sysconfig/network-scripts/ifcfgg-eth0
    
# 4.以1开头的行
    grep "^1" 1.txt
        1223344
        1234
        1222444
        122222
        12222446	
    
# 5.要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
    grep "^[^#]" /etc/nginx/nginx.conf
    
# 不以#开头,且不以空格开头的行
    grep '^[^# ]' /etc/nginx/nginx.conf

# 6.要求匹配出2后面有任意数量的任意字符
    grep "2.*" 1.txt 
      
# 7.要求匹配出本机中所有的普通用户
    grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
        test04:x:1001:1001::/home/test04:/bin/bash
        test:x:1002:1002::/home/test:/bin/bash
        test01:x:1003:1003::/home/test01:/bin/bash
        
    egrep ":[0-9]{4}" /etc/passwd 

2.拓展正则表达式

# egrep 等价于 grep -E

+    匹配前一个字符1次或1次以上
?   匹配前一个字符0次或1次
|    表示或者,即同时过滤多个字符串(竖线两边的字符的或者)
()   分组,组成一个整体,另外()的内容可以被后面的\n引用,n为数字,代表引用第几个括号的内容
  \n   n代表的是前面第几个分组  引用前面()分组里的模式,

{m,n}  匹配前一个字符最少m次,最多n次
{m}    匹配前一个字符m次
{m,}   匹配前一个字符最少m次
{,n}   匹配前一个字符最多n次

拓展正则案例

# 1.匹配一个或多个2
    egrep "2+" 1.txt
    egrep "22*" 1.txt
    egrep "2{1,}" 1.txt
    
# 2.查询出3个2
     egrep "2{3}" 1.txt
     
# 3.查询出包含 22 或者 33 的行
     egrep "22|33" 1.txt
     
# 4.匹配出包含12341234的行
     grep -E "(1234)\1" 1.txt
     grep -E "(1234){2}" 1.txt
     grep  "12341234" 1.txt
     egrep "(1234)(1234)" 1.txt
     
# 5.要求匹配出包含1234abcd1234abcd的行
      grep "1234abcd1234abcd" 1.txt
      grep -E "(1234)(abcd)\1\2" 1.txt
      
# 6.过滤出当前系统IP
    ip a |grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
        127.0.0.1
        192.168.15.110
        192.168.15.255
        172.22.0.110
        172.22.15.255

# 7.过滤出手机号
echo "15516134567" | grep -E "(155|187|136|166|177|138|137|188)[0-9]{8}$"
    15516134567

egrep '^1[0-9]{10}$' 1.txt

# 8.过滤出邮箱
echo "12345@qq.com" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
	12345@qq.com
posted @   Edmond辉仔  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示