第21节正则表达式-sed-cut的使用
本节所讲内容:
21.1 正则表达式
1.1为什么要使用正则表达式
在企业工作中,每天做的Linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定字符串。这就需要正则表达式,因此,可以说正则表达式就是为过滤这样的字符串而生的。例如我要查一下本机是否有一个叫tom的用户:
[root@node-1 ~]# grep tom /etc/passwd
tom:x:1003:1003::/home/tom:/bin/bash
1.2 基本正则表达式与扩展正则表达式
基本正则表达式:grep
扩展正则表达式:egrep
基础正则表达式:
^word 搜索以此字符开头的内容
word$ 搜索以此字符结尾的内容
^$ 搜索空行
\ 转意字符
\n 换行符
\r 匹配回车

  • 重复前面任意包括0个字符
    ? 重复前面0或1个字符
    . 任意字符
    [abc] 匹配字符集内的任意一个字符
    [^abc] 匹配时取反,不包含
    [1-9] 匹配括号内的范围内的任意字符即1-9任何一个字符就可以
    扩展的正则表达式:ERE(egrep或grep -E
  • 重复一次或一次以上前面的一个字符。
    ? 重复0次或一次前面的一个字符。
    | 或者的意思,用或的方式查找多个符合的字符串。
    () 找出括号内的字符串
    说了这么多了,就举粟说明吧
    例1:此例很有普遍性,配置文件一般说明性文字很多需要过滤掉
    ---去掉空白行与注释
    [root@node-1 ~]# egrep -v "^$|^#" /etc/ssh/sshd_config
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication no
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UseDNS no
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem sftp /usr/libexec/openssh/sftp-server
    例2:复习字符.的使用
    [root@node-1 ~]# grep .ot /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

grep用法:
作用:grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,过滤数据流或文件内容。
语法格式:grep [选项] [条件表达式] 目标文件
常用选项:
-i 忽略大小写
-n 显示行号
-v 反身匹配
-E 扩展正则表达式
-e 查找指定字符
-c 统计个数
例3:grep参数的使用
[root@node-1 ~]# cat /proc/meminfo |grep -e Mem -e Cache -e Swap
MemTotal: 3863532 kB
MemFree: 2129012 kB
MemAvailable: 3360472 kB
Cached: 1399964 kB
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB

[root@node-1 ~]# grep -v root 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

##统计系统中能登录的用户的个数
[root@node-1 ~]# cat /etc/passwd |grep -c bash$
8

##截取ip地址
[root@node-1 ~]# ip a |grep inet |grep eth0 |grep -o "inet[^/]" |grep -o "[0-9.]"
192.168.26.71

[root@node-1 ~]# egrep "3306|1521" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager

21.2 sed流编辑器
2.1一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。可删除(delete)、改变(change)、添加(append)、插入(insert)、合并、交换文件中的数据行。默认情况下不会对文件修改,只是在屏幕上显示出来
语法:sed [options] 'command' file(s)
选项:
-n 抑制自动打印pattern space,sed默认输出全部,-n用于取消默认输出;
-i 编辑文件;
-r 支持扩展正则表达式;
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

  • 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    2.2 修改:默认在屏幕显示,加参数-i后才会修改文件
    语法:sed '/正则匹配条件/s/old/new/g' 文件
    ##编写测试文件
    [root@node-1 ~]# vim ip
    [root@node-1 ~]# cat ip
    IP1=static
    IP2=static
    IP0=static
    ##只是在屏幕显示,文件内容没有修改
    [root@node-1 ~]# sed 's/static/dhcp/g' ip
    IP1=dhcp
    IP2=dhcp
    IP0=dhcp
    [root@node-1 ~]# cat ip
    IP1=static
    IP2=static
    IP0=static
    ##加-i参数后,文件内容才会修改
    [root@node-1 ~]# sed -i '/^IP1/s/static/dhcp/g' ip ##将IP1开头的行替换
    [root@node-1 ~]# cat ip
    IP1=dhcp
    IP2=static
    IP0=static

[root@node-1 ~]# sed -i '2s/static/dhcp/g' ip ##指定特定行号2行替换
[root@node-1 ~]# cat ip
IP1=dhcp
IP2=dhcp
IP0=static

##常用禁用selinux的命令
[root@node-1 ~]# sed -i '7s/enforcing/disabled/g' /etc/selinux/config && setenforce 0

2.3删除:
语法:sed '/表达式/d' 文件
[root@ns ~]# vim ip ##添加空行
[root@node-1 ~]# cat ip
IP1=dhcp

IP2=dhcp

IP0=static

[root@node-1 ~]# sed -i '/^$/d' ip && cat ip ##删除空行并显示删除后的内容--常用
[root@node-1 ~]# sed -i '/IP1/d' ip && cat ip ##删除包含IP1的行
IP2=dhcp
IP0=static
[root@node-1 ~]# sed -i '/^IP2/d' ip && cat ip ##删除以IP2开头的行
[root@node-1 ~]# sed -i 'd' ip && cat ip ##删除所有行

2.4增加
语法:sed '/表达式/a "需要添加的文字"' 文件
添加行注意:
命令i(insert插入),在当前行前面插入一行
命令a(append附加),在当前行后面添加一行
##在第三行之后插入内容
[root@node-1 ~]# sed -i '3a IP3=static' ip && cat ip
IP1=static
IP2=static
IP0=static
IP3=static
#在第三行之前插入内容
[root@node-1 ~]# sed -i '3i IP=static' ip && cat ip
IP1=static
IP2=static
IP=static
IP0=static
IP3=static

2.5查找并显示:
语法:sed -n '/表达式/p' 文件
##查看第二行
[root@node-1 ~]# sed -n '2p' ip
IP2=static
21.2 cut命令
语法: cut(选项)(参数)
选项
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
例4:
[root@node-1 ~]# cut -d : -f 1-3 passwd
root:x:0
bin:x:1
daemon:x:2
补充知识:
脚本检查语法是否有错:
bash -v aa.sh #查看脚本aa.sh是否存在语法错误
bash -x aa.sh #查看脚本aa.sh详细的执行过程