Shell编程之正则表达式

一.什么是正则表达式

  • 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

二.shell编程之正则表达式与通配符

1.通配符
  • *匹配任意内容
  • ?匹配任意一个内容
  • []匹配中括号中的一个字符
2.正则表达式与通配符
  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来匹配了。

三.Shell编程之基础正则表达式

元字符作用
*前一个字符匹配0次或任意多次
.匹配除了换行符外任意一个字符
^匹配行首。例如:^hello会匹配以hello开头的行
$匹配行尾。例如:hello$会匹配以hello结尾的行
[]匹配中括号中指定的任意一个字符,只匹配一个字符
[^]匹配除中括号的字符意外的任意一个字符
\转义符,用于取消特殊符号的含义
\{n\}表示其前面的字符恰好出现n次
\{n,\}表示其前面的字符出现不小于n次
\{n,m\}表示其前面的字符至少出现n次,最多出现m次
  • 只要是按规则包含的行就会匹配(包含匹配,与java等其他语言匹配不太相同)

四.字符截取命令

1.cut字段提取命令[列提取]
  • [root@localhost ~]# cut [选项] 文件名

    • -f 列号:提取第几列
    • -d 分隔符:按照指定分隔符分割列
  • 如想获得/etc/passwd下获得指定用户名user1和user2

    • 源文件中的内容

      user1:x:1001:1001::/home/user1:
      user2:x:1002:1002::/home/user2:
      
    • 截取命令

      grep "user[0-9]" /etc/passwd | cut -f 1 -d ":"
      
    • 结果

      user1
      user2
      
  • cut默认\t为其分隔符,故使用cut截取df -h无效

2.printf命令
  • printf ‘输出类型输出格式’ 输出内容

    • 输出类型

      • -%ns:输出字符串。n是数字指代输出几个字符
      • -%ni:输出整数。n是数字指代输出几个数字
      • -%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数
        • %8.2f代表共输出8位数,其中2位是小数,6位是整数
    • 输出格式

      • \a:输出警告声音
      • \b:输出退格键,也就是Backspace键
      • \f:清除屏幕
      • \n:换行
      • \r:回车,也就是Enter键
      • \t:水平输出退格键,也就是Tab键
      • \v:垂直输出退格键,也就是Tab键
    • 使用实例

      printf '%s/t%s/t%s/n' 1 2 3 4 5 6
      #输出结果
      #1	2	3
      #4	5	6
      
  • 在awk命令的输出中支持print和printf命令

    • print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
    • printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
3.awk命令
  • awk '条件1{动作1}条件2{动作2}...‘ 文件名

    • 条件(Pattern)

      • 一般使用关系表达式作为条件
      • x>10判断变量x是否大于10
      • x>=10大于等于
      • x<=10小于等于
    • 动作(Action)

      • 格式化输出
      • 流程控制语句
    • 实例

      awk '{printf $2 "\t" $4 "\n"}' student.txt#$2表示第二列,$4第四列,awk是一行一行读处理的,输出格式需要用双引号标识
      df -h | awk '{print $5}'#截取第五列
      
      awk 'BEGIN{print "This is beginning"}{print $2 "\t" $4}' student.txt
      #BEGIN作用,在所有数据处理之前执行
      #打印结果
      #This is beginning
      #Name	Mark
      #furong	85
      #fengj	60
      #cang	70
      
      cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"}{print $1 "\t" $3}'
      #结果(因为最起初会加载第一行,FS表示以指定符号分割)
      #root:x:0:0:root:/root:/bin/bash
      #user1 500
      #user2 501
      cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'
      #结果
      #root 0
      #user1 500
      #user2 501
      
4.sed命令
  • sed [选项] '[动作]' 文件名

    • 选项

      • -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
      • -e:允许对输入数据应用多条sed命令编辑(在动作中用分号分隔)
      • -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
    • 动作

      • a:追加,在当前行后添加一行或多行
      • c:行替换,用c后面的字符串替换原始数据行
      • i:插入,在当前行前插入一行或多行。
      • d:删除,删除指定的行
      • p:打印,输出指定的行
      • s:字串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字串/新字串/g“(和vim中的替换格式类似)【没加行范围则是全局替换】
    • 实例代码

      sed '2p' student.txt
      #ID	Name	gender	Mark
      #1	furong	F	85
      #1	furong	F	85
      #2	fengj	F	60
      #3	cang	F	70
      
      sed -n '2p' student.txt#一般加p的动作,都适用-n选项
      #1	furong	F	85
      
      sed '2,4d' student.txt
      #ID	Name	gender	Mark  删除第二行到第四行,只剩第一行了
      
      sed '2a 1-1    Jack  G      90' student.txt#在指定行之后添加
      #ID	Name	gender	Mark
      #1	furong	F	85
      #1-1    Jack  G      90
      #2	fengj	F	60
      #3	cang	F	70
      
      

五.字符处理命令

1.排序命令sort
  • sort [选项] 文件名

    • 选项

      • -f:忽略大小写
      • -n:以数值型进行排序,默认使用字符串型排序
      • -r:反向排序
      • -t:指定分隔符,默认分隔符是制表符
      • -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
    • 实例代码

      sort -n -t ":" -k "3,3" /etc/passwd#以数值型为基准,:为分隔符,按照第三列排序/etc/passwd文件
      
2.统计命令wc
  • wc [选项] 文件名

    • 选项

      • -l:只统计行数
      • -w:只统计单词数
      • -m:只统计字符数
    • 实例代码

      wc /etc/passwd#获得指定文件的行数,单词数和字符数
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值