正则表达式----基础表达式

一、grep / egrep工具的使用

命令格式:grep [-cinvABC] ‘word’ filename
在这里插入图片描述

[root@localhost sh]# cp /etc/passwd ./

-A2:会把包含halt的行以及这行下面的两行都打印出来  
[root@localhost sh]# grep -A2 'halt' passwd      
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

-B2:会把包含halt的行以及这行下面的两行都打印出来
[root@localhost sh]# grep -B2 'halt' passwd  
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

-C2:会把包含halt的行以及这行上下各两行都打印出来
[root@localhost sh]# grep -C2 'halt' passwd   
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

1、过滤出带某个关键字的行,并输出行号

[root@localhost sh]# grep -n 'halt' passwd    前面的8,表示行号
8:halt:x:7:0:halt:/sbin:/sbin/halt

2、过滤出不带某个关键字的行,并输出行号

[root@localhost sh]# grep -vn 'nologin' /etc/passwd     
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt

3、过滤出所有包含数字的行

[root@localhost sh]# grep '[0-9]' passwd
root:x:0:0:root:/root:/bin/bash
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

4、过滤出所有不包含数字的行

自己创建一个文档进行实验
[root@localhost ~]# echo '6699' > 1.txt
[root@localhost ~]# echo 'gzgz' >> 1.txt  
[root@localhost ~]# grep -v '[0-9]' 1.txt
gzgz

5、过滤出所有以#开头的行

[root@localhost ~]#  echo '#gzdr' >> 1.txt    
[root@localhost ~]# cat 1.txt
6699
gzgz
#gzdr
[root@localhost ~]# grep -v '^#' 1.txt       
6699
gzgz

6、过滤掉所有以空格和以#开头的行

[root@localhost ~]# cat 1.txt
6699
gzgz
#gzdr

[root@localhost ~]# grep -v '^#' 1.txt |grep -v '^$'
6699
gzgz

在正则表达式中,^表示开头,$表示行的结尾,^$表示空行

示例:打印出不以英文字母开头的行

[root@localhost ~]# grep '^[^a-zA-Z]' 1.txt
[root@localhost ~]# grep '[^a-zA-Z]' 1.txt 

在这里插入图片描述
在这里插入图片描述
7、过滤出任意一个字符和重复字符

. 表示任意一个字符,即 r.o 表示把 r和o 之间有一个任意字符的行过滤出来

[root@localhost ~]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

表示零个或多个 * 前面的字符,ooo表示oo,ooo这样的多个o

[root@localhost ~]# grep 'ooo*' passwd   
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

.* 表示零个或多个任意字符,空行也包含在内,它会把/etc/passwd 文件里面所有的行都匹配到

[root@localhost ~]# grep '.*' passwd |wc -l
20

8、指定要过滤出的字符出现的次数
在这里插入图片描述
9、egrep命令的使用
过滤出一个或多个指定的字符

[root@localhost ~]# cat 2.txt
root:x:0:0:root:/root:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
[root@localhost ~]# egrep 'o+' 2.txt     过滤出一个以上的o字符
[root@localhost ~]# egrep 'oo+' 2.txt    过滤出两个以上的o字符

在这里插入图片描述

egrep是grep的扩展版本,grep不支持+的使用,但是egrep却支持 {} 的使用,还不用转义符 \

[root@localhost ~]# egrep 'o{2}' 2.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

过滤出零个或一个指定的字符

[root@localhost ~]# egrep 'o?' 2.txt
root:x:0:0:root:/root:/bin/bash
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
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
[root@localhost ~]# egrep 'ooo?' 2.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# egrep 'oo?' 2.txt 
root:x:0:0:root:/root:/bin/bash
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

在这里插入图片描述
过滤出字符串1或者字符串2

[root@localhost ~]# egrep 'aaa|111|ooo' 2.txt  
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
rato:rooot

egrep中()的使用
()表示是一个整体,下一个例子会把包含rato和rooot的行都过滤出来

[root@localhost ~]# egrep 'r(oo|at)o' 2.txt
rato:rooot
也可以和其他符号结合在一起
[root@localhost ~]# egrep '(oo)+' 2.txt     
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
rato:rooot

二、sed工具的使用

在这里插入图片描述
grep只能是查找功能,sed能把查找的替换编辑
1、打印某一行

[root@localhost ~]# sed -n '2'p /etc/passwd   表示打印第一行
bin:x:1:1:bin:/bin:/sbin/nologin

去掉-n后就会全部打印出来
[root@localhost ~]# sed '2'p passwd        
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

也可指定全部打印出来
[root@localhost ~]# sed -n '1,$'p passwd      
root:x:0:0:root:/root:/bin/bash
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

打印第一行到第三行
[root@localhost ~]# sed -n '1,3'p 2.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

2、打印包含某个字符串的行
打印包含字符串root的行

[root@localhost ~]# sed -n '/root/'p 2.txt
root:x:0:0:root:/root:/bin/bash

打印字符串以1开头的行

[root@localhost ~]# sed -n '/^1/'p 2.txt      
111111111111111111111111111111

打印以 in 结尾的行

[root@localhost ~]# sed -n '/in$/'p 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@localhost ~]# sed -n '/r..o/'p 2.txt
rato:rooot
[root@localhost ~]# 
[root@localhost ~]# sed -n '/ooo*/'p 2.txt   
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
rato:rooot

-e:选项可以实现多个行为,以下的例子即是打印第一行和包含字符串111的行

[root@localhost ~]# sed -e '1'p -e '/111/'p -n 2.txt 
root:x:0:0:root:/root:/bin/bash
111111111111111111111111111111

3、删除某些行
参数 d 表示删除的动作,它不仅可以删除指定的单行及多行,而且可以删除匹配某个字符的行,还可以删除从某一行开始到文档最后一行的所有的行。不过,这个操作仅仅是在显示器屏幕上并不显示这些行,文档里不会删除。

[root@localhost ~]# sed '1'd 2.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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

[root@localhost ~]# sed '1,3'd 2.txt
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

4、替换字符或删除字符串
其中,S 参数即是表达替换的动作,参数 g 表示本行全局替换,如果不加 g 则值替换本行出现的第一个

[root@localhost ~]# sed '1,2s/ot/to/g' 2.txt  
roto:x:0:0:roto:/roto:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

其中,s参数即是表示替换的动作,参数 g 表示本行全局替换,如果不加 g 则值替换本行出现的第一个

除了使用分隔符,其他字符也可以

[root@localhost ~]# sed 's#ot#to#g' 2.txt       
roto:x:0:0:roto:/roto:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooto

[root@localhost ~]# sed 's@ot@to@g' 2.txt   
roto:x:0:0:roto:/roto:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooto

删除文档中所有的数字或者字母

[root@localhost ~]# sed 's/[0-9]//g' 2.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

aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:::games:/usr/games:/sbin/nologin

[root@localhost ~]# sed 's/[a-zA-Z]//g' 2.txt   
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
111111111111111111111111111111

::12:100:://://
:

5、调换两个字符的位置

文件内容
[root@localhost ~]# cat 2.txt
root:x:0:0:root:/root:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

小括号在sed命令中属于特殊符号,必须在前面加上转义字符 \

[root@localhost ~]# sed 's/\(rot\)\(.*\)\(bash\)/\3\2\1/' 2.txt
root:x:0:0:root:/root:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

在这里插入图片描述
加上-r选项后

[root@localhost ~]# sed -r 's/(rot)(.*)(sbin)/\3\2\1/' 2.txt          
root:x:0:0:root:/root:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooot

在某行前面添加指定的内容

[root@localhost ~]# sed 's/^.*$/hello&/' 2.txt
helloroot:x:0:0:root:/root:/bin/bash
hellobin:x:1:1:bin:/bin:/sbin/nologin
hellodaemon:x:2:2:daemon:/sbin:/sbin/nologin
helloadm:x:3:4:adm:/var/adm:/sbin/nologin
hellolp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
hellosync:x:5:0:sync:/sbin:/bin/sync
hello111111111111111111111111111111
helloaaaaaaaaaaaaaaaaaaaabbbbbbbbbb
hellogames:x:12:100:games:/usr/games:/sbin/nologin
hellorato:rooot

6、直接修改文件内容

把文档中的ot换成to

[root@localhost ~]# sed 's/ot/to/g' 2.txt
roto:x:0:0:roto:/roto:/bin/bash
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
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaabbbbbbbbbb
games:x:12:100:games:/usr/games:/sbin/nologin
rato:rooto

易混淆之处:
在这里插入图片描述
在这里插入图片描述
1、删除文档中所有的特殊字符(除数字以及大小写字母)

[root@localhost ~]# sed 's/[^0-9a-zA-Z]//g' passwd
rootx00rootrootbinbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin
admx34admvaradmsbinnologin
lpx47lpvarspoollpdsbinnologin
syncx50syncsbinbinsync
shutdownx60shutdownsbinsbinshutdown
haltx70haltsbinsbinhalt
mailx812mailvarspoolmailsbinnologin
operatorx110operatorrootsbinnologin
gamesx12100gamesusrgamessbinnologin
ftpx1450FTPUservarftpsbinnologin
nobodyx9999Nobodysbinnologin
systemdnetworkx192192systemdNetworkManagementsbinnologin
dbusx8181Systemmessagebussbinnologin
polkitdx999997Userforpolkitdsbinnologin
postfixx8989varspoolpostfixsbinnologin
sshdx7474PrivilegeseparatedSSHvaremptysshdsbinnologin
ntpx3838etcntpsbinnologin
apachex4848Apacheusrsharehttpdsbinnologin

2、把文档第一个单词和最后一个单词调换位置(假如每一个括号用123代表,第一个括号用1代表,第二个括号用2代表,第三个括号用3代表)

[root@localhost ~]# sed -r 's/(^[a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([^a-zA-Z]+$)/\3\2\1/' passwd                        
root:x:0:0:root:/root:/bin/bash
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

3、文档中出现的第一组数字(一个或多个)和最后一个单词掉换位置

[root@localhost ~]# sed -r 's/(^[^0-9]*)([0-9]+)([^0-9].*[a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/' passwd   
root:x:h:0:root:/root:/bin/bas0
bin:x:n:1:bin:/bin:/sbin/nologi1
daemon:x:n:2:daemon:/sbin:/sbin/nologi2
adm:x:n:4:adm:/var/adm:/sbin/nologi3
lp:x:n:7:lp:/var/spool/lpd:/sbin/nologi4
sync:x:c:0:sync:/sbin:/bin/syn5
shutdown:x:n:0:shutdown:/sbin:/sbin/shutdow6
halt:x:t:0:halt:/sbin:/sbin/hal7
mail:x:n:12:mail:/var/spool/mail:/sbin/nologi8
operator:x:n:0:operator:/root:/sbin/nologi11
games:x:n:100:games:/usr/games:/sbin/nologi12
ftp:x:n:50:FTP User:/var/ftp:/sbin/nologi14
nobody:x:n:99:Nobody:/:/sbin/nologi99
systemd-network:x:n:192:systemd Network Management:/:/sbin/nologi192
dbus:x:n:81:System message bus:/:/sbin/nologi81
polkitd:x:n:997:User for polkitd:/:/sbin/nologi999
postfix:x:n:89::/var/spool/postfix:/sbin/nologi89
sshd:x:n:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologi74
ntp:x:n:38::/etc/ntp:/sbin/nologi38
apache:x:n:48:Apache:/usr/share/httpd:/sbin/nologi48

4、把文档中第一个数字移动到本行末尾

[root@localhost ~]# sed -r 's/(^[^0-9]*)([0-9]+)([^0-9].*$)/\3\2\1/' passwd
:0:root:/root:/bin/bash0root:x:
:1:bin:/bin:/sbin/nologin1bin:x:
:2:daemon:/sbin:/sbin/nologin2daemon:x:
:4:adm:/var/adm:/sbin/nologin3adm:x:
:7:lp:/var/spool/lpd:/sbin/nologin4lp:x:
:0:sync:/sbin:/bin/sync5sync:x:
:0:shutdown:/sbin:/sbin/shutdown6shutdown:x:
:0:halt:/sbin:/sbin/halt7halt:x:
:12:mail:/var/spool/mail:/sbin/nologin8mail:x:
:0:operator:/root:/sbin/nologin11operator:x:
:100:games:/usr/games:/sbin/nologin12games:x:
:50:FTP User:/var/ftp:/sbin/nologin14ftp:x:
:99:Nobody:/:/sbin/nologin99nobody:x:
:192:systemd Network Management:/:/sbin/nologin192systemd-network:x:
:81:System message bus:/:/sbin/nologin81dbus:x:
:997:User for polkitd:/:/sbin/nologin999polkitd:x:
:89::/var/spool/postfix:/sbin/nologin89postfix:x:
:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin74sshd:x:
:38::/etc/ntp:/sbin/nologin38ntp:x:
:48:Apache:/usr/share/httpd:/sbin/nologin48apache:x:

5、把文档中的第20行到最后一行最前面加上aaa

[root@localhost ~]# sed '20,$s/^.*$/aaa:&/' passwd
root:x:0:0:root:/root:/bin/bash
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
aaa:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

三、awk的工具使用

1、截取文档中的某个段

[root@localhost ~]# head -n2 passwd |awk -F ':' '{print $1}'
root
bin

-F 的选项是指分隔符,如果不加,则默认用空格或者tab为分隔符。print是打印,用来打印某个字符。$1是指第一个字符,$2是指第二个字符,以此类推。但$0表示整行。

[root@localhost ~]# head -n2 passwd |awk -F ':' '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

print打印自定义内容要用双引号括起来

[root@localhost ~]# head -n2 passwd |awk -F ':' '{print $1"@"$2}'  
root@x
bin@x

2、匹配字符或字符串
显示包含00的一行

[root@localhost ~]# awk '/00/' passwd  
games:x:12:100:games:/usr/games:/sbin/nologin

这里的~符号是匹配的意思,命令的意思是:以 :为分隔符,显示第一行匹配的oo

[root@localhost ~]# awk -F ':' '$1~/oo/' passwd         
root:x:0:0:root:/root:/bin/bash

awk的多个匹配

[root@localhost ~]# awk -F ':' '/root/{print $1,$3} /test/ {print $1,$3}' passwd
root 0
operator 11

3、条件操作符
awk可以用逻辑符号进行判断,注意:在和数字比较时,若用双引号括起来则认为字符,不加则认为数字

[root@localhost ~]# awk -F ':' '$3>="500"' passwd  
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

不加双引号

[root@localhost ~]# awk -F ':' '$3>=500' passwd  
polkitd:x:999:997:User for polkitd:/:/sbin/nologin

!= 表示不匹配

[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin"' passwd      
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 ~]# awk -F ':' '$3>="5" && $3<"7"' passwd   
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

&&表示或者

[root@localhost ~]# awk -F ':' '$3>1000 || $7=="/bin/bash"' passwd          
root:x:0:0:root:/root:/bin/bash

4、awk的内置变量
awk常用的变量有OFS、NF和NR、OFS和-F选项有类似的功能,也可用来定义分隔符的,但是它是在输出的时候定义,NF表示用分隔符分隔后一共有多少段,NR表示行号

[root@localhost ~]# head -5 passwd |awk -F ':' '{OFS="#"} {print $1,$2,$4}'
root#x#0
bin#x#1
daemon#x#2
adm#x#4
lp#x#7

还有一些结合 if 的用法

[root@localhost ~]# awk -F ':' '{OFS="#"} {if($3>100) {print $1,$2,$3,$4}}' passwd  
systemd-network#x#192#192

NF代表一行有多少个域(也就是一行有多少个单词)

[root@localhost ~]# head -3 passwd |awk -F ':' '{print NF}'
7
7
7

$NF代表最后一个域(也就是最后一个单词)

[root@localhost ~]# head -3 passwd |awk -F ':' '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
[root@localhost ~]# head -3 passwd |awk -F ':' '{print NR}'
1
2
3

NR代表的是这个文本的行数(记录数)用它作为判断条件

[root@localhost ~]# awk 'NR>40' passwd       (因为passwd文档只有22行,所以没有输出)
[root@localhost ~]# awk 'NR>4' passwd 
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

配合段匹配一起使用,以下命令意思是以:显示符号为分隔符,字段小于20并且第一段匹配 root 的行

[root@localhost ~]# awk -F ':' 'NR<20 && $1 ~/root/' passwd
root:x:0:0:root:/root:/bin/bash

5、awk中的数学运算
awk可以更改段值

[root@localhost ~]# head -n 3 passwd |awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin

对各个段进行数值运算

[root@localhost ~]# head -n2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@localhost ~]# head -n2 passwd |awk -F ':' '{$7=$3+$4}'
[root@localhost ~]# head -n2 passwd |awk -F ':' '{$7=$3+$4;print $0}'
root x 0 0 root /root 0
bin x 1 1 bin /bin 2

计算某个段的总和

[root@localhost ~]# awk -F ':' '{(tot=tot+$3)};END{print tot}' passwd
1693

结合 if 循环使用

[root@localhost ~]# awk -F ':' '{if($1=="root"){print $0}}' passwd
root:x:0:0:root:/root:/bin/bash

四、printf命令

在这里插入图片描述

[root@localhost ~]# printf %s 1 2 3 4 5
12345
[root@localhost ~]# printf "%s %s %s" 1 2 3 4 5 6
1 2 34 5 6
[root@localhost ~]# printf "%s %s %s\n" 1 2 3 4 5 6
1 2 3
4 5 6
[root@localhost ~]# cat student.txt
ID  NAME  PHP  PYTHON  WEB 
1   NZQ   87     98    80
2   XLJ   56     99    88
3   TJD   78     80    50

不调整输出格式

[root@localhost ~]# printf '%s' $(cat student.txt)
IDNAMEPHPPYTHONWEB1NZQ8798802XLJ5699883TJD788050

调整格式输出

[root@localhost ~]# printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt)
ID  NAME  PHP  PYTHON  WEB 
1   NZQ   87     98    80
2   XLJ   56     99    88
3   TJD   78     80    50

在这里插入图片描述
五、条件判断
1、按照文件类型判断
在这里插入图片描述
在这里插入图片描述
2 、按照文件权限进行判断
在这里插入图片描述
3 、两个文件之间进行比较
在这里插入图片描述
4、 两个整数之间进行比较
在这里插入图片描述
5、字符串的判断
在这里插入图片描述
在这里插入图片描述
6、 多重条件判断
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值