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编程之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章