logo头像
Snippet 博客主题

Linux基础-正则表达式之三剑客

本文于535天之前发表,文中内容可能已经过时

Linux的世界里一切皆文件,对Linux的操作就是对文件的处理.被业界称为”三剑客”的awk,sed,grep就能够帮助我们更方便更高效的处理文件.
“三剑客”中grep擅长查找功能,sed擅长取行和替换,awk擅长取列.
“三剑客”就是普通的Linux命令,而正则表达式好比一个模板,两者结合使用,能够发挥巨大的作用,尤其是在Shell脚本中,使我们的代码短小精悍.总之就是一句话:提高工作效率.

正则表达式

字符串:”abcaxc”,正则表达式为:ab.*c

  • 贪婪模式: 编程中默认模式,正则表达式一般趋向于最大长度[匹配.如正则ab.*c最大匹配为:abcaxc
  • 非贪婪模式: 正则匹配到结果就好,说白了就是最少匹配.如正则ab.*c最大匹配为:abc

    grep命令

    grep命令是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行.
    unix的grep家族包括grep,egrep和fgrep,笔者在这不一一列举了,读者可自行研究.

    常用选项

      -c : 计算找到’搜寻字符串’的次数
      -i : 忽略大小写进行搜索
      -n : 顺便输出行号
      -v : 反向选择,取反搜索
      -color=auto : 可以找到的搜索关键字加上颜色显示

实战示例

1.通过管道查找配置文件里的字符

1
2
[root@litong ~]# cat server.conf | grep port
port : 9001

2.通过管道查找以*.conf结尾的文件

1
2
[root@litong ~]# ll | grep *.conf
-rw-r--r-- 1 root root 22 May 18 14:51 server.conf

3.根据关键字查找进程信息

1
2
3
[root@litong ~]# ps -ef | grep pptpd
root 29510 1 0 14:55 ? 00:00:00 /usr/sbin/pptpd -f
root 30061 25475 0 14:58 pts/2 00:00:00 grep --color=auto pptpd

sed命令

sed是一项Linux指令,功能同awk类似,差别在于,sed简单,擅长取行和替换,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大.

命令格式

  • sed [options] ‘command’ file(s)
  • sed [options] -f scriptfile file(s)

    取行选项

  • a\ 在当前行下面插入文本.
  • i\ 在当前行上面插入文本.
  • c\ 把选定的行改为新的文本.
  • d 删除,删除选择的行.
  • D 删除模板块的第一行.
  • s 替换指定字符
  • h 拷贝模板块的内容到内存中的缓冲区.
  • H 追加模板块的内容到内存中的缓冲区.
  • g 获得内存缓冲区的内容,并替代当前模板块中的文本.
  • G 获得内存缓冲区的内容,并追加到当前模板块文本的后面.
  • l 列表不能打印字符的清单.
  • n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令.
  • N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码.
  • p 打印模板块的行.
  • P(大写) 打印模板块的第一行.
  • q 退出Sed.
  • b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾.
  • r file 从file中读行.
  • t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾.
  • T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾.
  • w file 写并追加模板块到file末尾.
  • W file 写并追加模板块的第一行到file末尾.
  • ! 表示后面的命令对所有没有被选定的行发生作用.
  • = 打印当前行号码.
  • # 把注释扩展到下一个换行符以前.

    替换选项

  • g 表示行内全面替换.
  • p 表示打印行.
  • w 表示把行写入一个文件.
  • x 表示互换模板块中的文本和缓冲区中的文本.
  • y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
  • \1 子串匹配标记
  • & 已匹配字符串标记

    实战示例

  1. 获取文件的行内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@litong ~]# sed -n 2p /etc/passwd  # 获取/ect/passwd第二行
    bin:x:1:1:bin:/bin:/sbin/nologin
    [root@litong ~]# sed -n 2,7p /etc/passwd # 获取/ect/passwd第二行到第七行
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2.替换文本

1
2
3
4
5
6
[root@litong ~]# sed -i 's/port/pp/g' server.conf  # 文件中含有port为全局替换pp,,并不会真正进行文件替换,而只是把操作后的文本返回
[root@litong ~]# cat server.conf
server
server
pp : 9001
pp : 9001

3.删除文本

1
2
3
4
5
[root@litong ~]# sed '2d' server.conf  # 删除文件的第二行,并不会真正删除文件行,而只是把操作后的文本返回
server
pp : 9001
pp : 9001
[root@litong ~]# sed '1,$d' server.conf #文件清空,,并不会真正删除文件行,而只是把操作后的文本返回

awk命令

awk是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这个命令擅长取列.
awk经过改进生成新的版本nawk和gawk,现在默认linux系统下日常使用gawk.

命令格式

  • awk [选项参数] ‘script’ var=value file(s)
  • awk [选项参数] -f scriptfile var=value file(s)

    选项参数

  • -F fs or –field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:.
  • -v var=value or –asign var=value
    赋值一个用户定义变量.
  • -f scripfile or –file scriptfile,从脚本文件中读取awk命令.
  • -mf nnn and -mr nnn,对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目.这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用.
  • -W compact or –compat, -W traditional or –traditional,在兼容模式下运行awk.所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略.
  • -W copyleft or –copyleft, -W copyright or –copyright,打印简短的版权信息.
  • -W help or –help, -W usage or –usage,打印全部awk选项和每个选项的简短说明.
  • -W lint or –lint,打印不能向传统unix平台移植的结构的警告.
  • -W lint-old or –lint-old,打印关于不能向传统unix平台移植的结构的警告.
  • -W posix,打开兼容模式.但有以下限制,不识别:/x,函数关键字,func,换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效.
  • -W re-interval or –re-inerval,允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]].
  • -W source program-text or –source program-text,使用program-text作为源代码,可与-f命令混用.
  • -W version or –version,打印bug报告信息的版本.

    实战示例

    1.按照指定的分隔符取列
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@litong ~]# cut -d: -f 1 /etc/passwd  # cut命令也可以取列
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    [root@litong ~]# awk -F: '{print $1}' /etc/passwd # awk命令取列
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail

企业实战-用三剑客取IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@litong ~]# ifconfig eth0 #查看eth0这块网卡的ip
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.21.205.254 netmask 255.255.240.0 broadcast 172.21.207.255
ether 00:16:3e:00:a1:e1 txqueuelen 1000 (Ethernet)
RX packets 599643 bytes 144572651 (137.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 590688 bytes 161445142 (153.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@litong ~]# ifconfig eth0 | grep -Po '(?<=inet )\S+' # grep取IP方式一
172.21.205.254
[root@litong ~]# ifconfig eth0 | grep -o "inet [0-9.]*" | grep -o "[0-9.]*" # grep取IP方式二
172.21.205.254
[root@litong ~]# ifconfig eth0 | awk -F "[ ]+" 'NR==2 {print $3}' # awk取IP
172.21.205.254
[root@litong ~]# ifconfig eth0 | sed -nr '2s#^[^0-9]*([0-9.]*).*$#\1#gp' # sed取IP方式一
172.21.205.254
[root@litong ~]# ifconfig eth0 | sed -nr '2s#^.*inet (.*) net.*$#\1#gp' # sed取IP方式二
172.21.205.254
[root@litong ~]# ifconfig eth0 | sed -n '2p' | sed 's#^.*inet ##g' | sed 's# netmask.*$##g' # sed取IP方式三
172.21.205.254

相关文档

菜鸟教程
三剑客取IP

支付宝打赏 微信打赏

请作者喝杯咖啡吧