04 grep正则表达式与shellscipt脚本编程

本文介绍了grep正则表达式的使用,包括匹配符、重复操作符及其应用实例。接着详细探讨了Shell脚本编程,包括脚本概述、awk脚本实现消费统计、函数定义与调用、变量类型、数组的使用以及分支、循环等控制结构。内容覆盖了从基础到进阶的grep和Shell脚本技巧。
摘要由CSDN通过智能技术生成


linux基础传送门:


grep正则表达式与shellscipt脚本编程

1.grep之正则表达式

  grep命令含义是打印匹配给定模型的行,grep 搜索以 “FILE” 命名的文件输入 ,寻找含有与给定的模式 PATTERN 相匹配的内容的行。默认情况下, grep 将把含有匹配内容的行打印出来。

命令格式如下:

grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

或者是在之前介绍的命令后面接管道符"|"再接grep正则表达式。

常用参数选项如下:

  • -n:在输出的每行前面加上它所在的文件中它的行号

  • -v:改变匹配的意义,只选择不匹配的行。

  • -Egrep -E==egrep,后接正则表达式。将模式 PATTERN 作为一个扩展的正则表达式来解释

  • -e:只能传递一个参数

1.1 匹配符与重复操作符介绍

1.1.1 匹配符
  • \ :转义字符\+ \< \>

  • . : 匹配任意单个字符

  • [1234abc],[^1234],[1-5],[a-d] :字符序列单字符占位 ,所有数字和数字匹配自身

    [1-5]匹配12345中的一个

    [^a-d]:匹配不是abcd中的任意一个字符

  • ^ :行首 ,^.k

  • $: 行尾 ,.k$

  • \<,\> :单词首尾边界 ;\<abc表示以abc开头的,abc\>表示以abc结尾的,\<are\>表示are单词

  • |:连接操作符,并集 ;(<are>)| (<you>) 表示出现are或出现you都符合条件

  • ,: 选择操作符 ,即多种情况时,以逗号分开

  • \n:反向引用

1.1.2 重复操作符
  • *:匹配 0 到多次

  • ?: 匹配 0 到 1 次

  • +:匹配 1 到多次

  • {n}: 匹配 n 次

  • {n,}:匹配n到多次

  • {m,n}:匹配m到n次

除了*是基本操作符外,其余全部是扩展操作符。grep命令默认工作于基本模式,使用grep -E使工作于扩展模式。

注意

基本正则表达式中元字符 :?,+,{,|,(和)丢失了特殊意义,需要加\,

反斜杠: \?,\+,\{,\|,\(以及\)扩展模式不需要加反斜杠

1.2 实例

  下面以文件hello.txt为例来展示grep的操作

hello world 
are you ok? 
areyou ok? 
areyou are youok? 
aaare you ok? 
aare you ok 
aaaare you ok 
abcre you ok? 
xxre you ok 
are yyyou ok? 
xk
zk
ok
yk
zzk 
zxzxk 
bxx 
cxx 
dxx 
areyou are youok? 
zk kz 1 
kz zk 2 
okk koo 3 
zkkz 
kzzk
  1. 匹配 are aare aaare,0 到多个 a 字符

    [root@node1 ~]# grep "a*re" hello.txt 
    

    image-20211210192547060

  2. 匹配“a 任意字符 re”

    [root@node1 ~]# grep "a.re" hello.txt 
    

    image-20211210192714083

  3. 匹配 a 一个到多个任意字符 re,此时,要使用扩展模式或者\+

    [root@node1 ~]# grep -E "a+re" hello.txt 
    或者
    [root@node1 ~]# grep "a\+re" hello.txt 
    

    image-20211210193651374

  4. 匹配包含 bcd 中任意一个字符的行

    [root@node1 ~]# grep "[b-d]" hello.txt 
    

    image-20211210195121320

  5. 基本正则模式,查找带问号的行,所以需要在基本模式下

    [root@node1 ~]# grep "?" hello.txt
    

    image-20211210195247150

  6. 匹配“a 任意一个字符或二个字符 re”,.表示任意一个字符,依此类推

    [root@node1 ~]# grep "a.re" hello.txt 
    
    [root@node1 ~]# grep "a..re" hello.txt 
    

    image-20211210195639720

  7. 匹配 zk 和 xk

    [root@node1 ~]# grep "[xz]k" hello.txt
    

    image-20211210195844763

  8. 匹配不是 zk 和 xk 的

    [root@node1 ~]# grep "\<[^zx]k" hello.txt
    

    image-20211210200059668

  9. 匹配行首,该行第二个字符一定得是 k

    [root@node1 ~]# grep "^.k" hello.txt 
    

    image-20211210200328499

  10. 匹配行尾,该行最少两个字符,最后一个是 k

    [root@node1 ~]# grep ".k$" hello.txt 
    

    image-20211210200609799

  11. 匹配单词边界

    [root@node1 ~]# grep "\<are\>" hello.txt
    

    image-20211210200856409

  12. 匹配单词开头

    [root@node1 ~]# grep "\<are" hello.txt
    

    image-20211210200950063

  13. 匹配单词尾

    [root@node1 ~]# grep "re\>" hello.txt
    

    image-20211210201052738

  14. 连接操作,取并集

    [root@node1 ~]# grep -E "(\<a*re\>)|(\<you\>)" hello.txt
    

    image-20211210201300596

  15. 匹配该行中 3 个 a 重复的

    [root@node1 ~]# grep -E "a{3}" hello.txt
    

    image-20211210201406989

2. Shell脚本编程

2.1 Shell脚本编程概述

  比如,现在有5000台机器构成的集群,有一个课件,想向每台机器上都上传一份该课件,如何做?

答:写一个shell脚本,将5000台机器的ip地址写到列表里面,利用for循环,循环遍历ip地址,在循环内部将课件传输到每台机器上。

  shell就是一个bash程序(进程),启动bash/python进程解释在脚本里编写的命令

  • 解释器,启动器:
    • 用户交互输入
    • 文本文件输入

脚本本质

  • #!/bin/bash(大多数的脚本都是bash脚本)
  • #!/usr/bin/python

读取(运行)脚本方式bash/sh file

  • 当前shell:source file
  • 新建子shell:/bin/bash file或者./file.sh(需要chmod a+x file.sh,给脚本添加执行权限,一般直接创建的文件是没有执行权限的,./file.sh需要该文件的执行权限)

shell脚本的好处:命令行中的命令都可以放到一个文件中,省的每次都得重新写大量的shell命令。

补充

  • echo $$打印当前bash的PID

    [外链图片转存失败,源站可能

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值