Shell编程之正则表达式

Posted 还行少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程之正则表达式相关的知识,希望对你有一定的参考价值。

一、正则表达式概述

linux文本处理工具

文本处理器基础正则表达式扩展正则表达式
vi编辑器支持
grep支持
egrep支持支持
sed支持
awk支持支持

1. 基础正则表达式

元字符作用
\\转义字符,用于取消特殊符号的含义
^匹配字符串的开始位置
$匹配字符串的结束位置
.匹配除\\n(换行)之外的任意一个字符
*匹配前面的子表达式0次或多次
[list]匹配list列表中的一个字符
[^list]匹配不在list列表中的一个字符
\\{n\\}匹配前面的子表达n次
\\{n,\\}匹配前面的子表达式不少于n次
\\{n,m\\}匹配前面的子表达式n到m次
[root@localhost ~]# grep root /etc/passwd    //筛选文件中包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin   
[root@localhost ~]# grep ^root /etc/passwd    //筛选以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep '[^s]bin' /etc/passwd     //筛选bin前面不是s的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
tvxq:x:1000:1000:tvxq:/home/tvxq:/bin/bash   
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash

2.扩展正则表达式

元字符作用
+匹配前面的子表达式1次以上
匹配前面的子表达式0次或1次
()将()中的字符串作为一个整体
|以或的方式匹配字符串
[root@localhost ~]# egrep '0+' /etc/passwd   //匹配至少一个0的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# egrep '(root|ntp)' /etc/passwd   //匹配包含root或ntp的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@localhost ~]# egrep 'ro?t' /etc/passwd    //匹配包含rt或rot的行
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin

二、Sed工具概述

1.Sed基本语法

  • 命令语法
    sed -e ‘编辑指令’ 文件1 文件2 …
    sed -n -e ‘编辑指令’ 文件1 文件2 …
    sed -i -e ‘编辑指令’ 文件1 文件2 …
  • 常用选项
    -e 指定要执行的命令,只有一个编辑命令可省略
    -n 只输出处理后的行
    -i 直接编辑文件,而不输出结果
  • 编辑指令格式:【地址1】【地址2】 操作【参数】
    “操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
    a:增加,在当前行下面增加一行指定内容。
    c:替换,将选定行替换为指定内容。
    d:删除,删除选定的行。
    i:插入,在选定行上面插入一行指定内容。
    p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
    s:替换,替换指定字符。
    y:字符转换。

2.Sed用法示例

示例1 删除文件每行第一个字符

[root@localhost ~]# head /etc/passwd > test.txt   
[root@localhost ~]# sed  's/^.//' test.txt
oot:x:0:0:root:/root:/bin/bash
in:x:1:1:bin:/bin:/sbin/nologin
aemon:x:2:2:daemon:/sbin:/sbin/nologin
dm:x:3:4:adm:/var/adm:/sbin/nologin
p:x:4:7:lp:/var/spool/lpd:/sbin/nologin
ync:x:5:0:sync:/sbin:/bin/sync
hutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
alt:x:7:0:halt:/sbin:/sbin/halt
ail:x:8:12:mail:/var/spool/mail:/sbin/nologin
perator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 

示例2 删除文件每行里的所有数字

[root@localhost ~]# sed  's/[0-9]//g' test.txt
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
[root@localhost ~]# 

示例3 删除test.txt中所有特殊字符

[root@localhost ~]# sed  's/[^a-Z0-9]//g' test.txt
rootx00rootrootbinbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin
admx34admvaradmsbinnologin
lpx47lpvarspoollpdsbinnologin
syncx50syncsbinbinsync
shutdownx60shutdownsbinsbinshutdown
haltx70haltsbinsbinhalt
mailx812mailvarspoolmailsbinnologin
operatorx110operatorrootsbinnologin

示例4 用sed修改ssh服务配置文件,去掉所有以#开头的行和空行,改变端口为2222,不允许root用户登录连接,修改UseDNS为no

[root@localhost ~]# sed  -e 's/#Port 22/Port 2222/' -e 's/#PermitRootlogin yes/PermitRootlogin no/' -e 's/#UseDNS yes/UseDNS no/' -e '/^#/d' -e '/^$/d' sshd.config
Port 2222
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 yes
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

示例5 调用脚本

[root@localhost test]# head /etc/passwd > pass.txt  //从passwd文件中提取前十行到pass.txt
[root@localhost test]# cat sed.sh 
#!/bin/sed  -f

s/root/ROOT/g     //将所有的root替换成ROOT
s/\\sbin\\/nologin/xxx/g   
1d               //删除第一行
[root@localhost test]# sed -i -f sed.sh pass.txt 

[root@localhost test]# cat  pass.txt 
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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ROOT:/sbin/nologin
[root@localhost test]# 

三、Awk工具介绍

1.Awk基本语法

awk 【选项】 '模式或条件{编辑指令}' 文件1 文件2   //过滤并输出文件中符合条件的内容
awk -f 脚本文件  文件1  文件2     //从脚本中调用编辑指令,过滤并输出内容

模式可以为条件语句,复合语句或正则表达式
在使用 awk 命令的过程中,可以使用逻辑操作符
“&&”表示“与”、“||” 表示“或”、“!”表示“非”;
还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方

单引号加上大括号“{}”用于设置对数据进行的处理动作
awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理

常见内置变量

变量描述
$0当前处理的行的整行内容
$n当前处理行的第 n 个字段(第 n 列)
NF当前处理的行的字段个数
NR当前处理的行的行号
FS指定每行文本的字段分隔符,默认为空格或制表位
OFS输出字段分隔符,默认为空格或制表位
RS输入的记录分隔符,默认为空格或制表位
ORS输出的记录分隔符,默认为空格或制表位

2.Awk用法示例

示例1 列出系统中用bash环境的用户

[root@localhost ~]# awk -F: '$7~/bash/{print $1}' /etc/passwd
root
tvxq
[root@localhost ~]# 

示例2 查看/etc/passwd这个文件,要求筛选出用户,uid和家目录,以及统计出一个共有多少个用户

[root@localhost ~]# awk -F: 'BEGIN{print "user\\t\\t\\t","UID\\t\\t\\t","home"}{print $1"\\t\\t\\t",$3"\\t\\t\\t",$6}END{print "total is "NR}' /etc/passwd
user			 UID			 home
root			 0			     /root
bin		     	 1		     	 /bin
daemon			 2		    	 /sbin
adm			     3		    	 /var/adm
...
tcpdump			 72			     /
tvxq			 1000			 /home/tvxq
total is 44
[root@localhost ~]# 

示例3 输出所有系统中的用户和他加密后的密码

[root@localhost ~]# awk -F: '{if($2!="*"&&$2!="!!"){print "用户名 "$1,"密码是 "$2}}' /etc/shadow
用户名 root 密码是 $6$yJ3dKevUaX8gSdu1$d66CL1ODS7fh9t7JZqfq0Hrb5qeHGFQ.xSy7DT84u5ej0sUmO7FvjR90VcNHzW0JmDLiYIcxkaMNoEnPT5Ibc0
用户名 tvxq 密码是 $6$ofGRDt4gApgPrawP$KlCkKsKzLrANar59653IK/V0MvSfDji/wlEN3mC6Qos1XyscPLMaio1BNJCciJQKNvzuPB4BxB70uUZ8LG2SS0
[root@localhost ~]# 

以上是关于Shell编程之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程三剑客之grep

shell脚本编程之正则表达式(扩展正则表达式sed)

shell编程之正则表达式

shell编程之正则表达式

Shell编程之正则表达式

05 shell编程之正则表达式