一、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、 多重条件判断