文章目录

  • 前言
  • 1.grep
  • 2.sed
  • 小练习
  • 3.awk
  • 练习


前言

这一节主要是对我们在脚本中常会用到的三种文本处理工具进行学习,相对来说awk的功能更加强大,但是都很重要,并且各有特点

1.grep

grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

##grep 格式##
grep 匹配条件 处理文件
grep root passwd #过滤root关键字
grep -i root passwd ##后略大小写
grep -E “<root” passwd ##root字符之前不能有字符
grep -E “root>” passwd ##root字符之后不能有字符
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A ##显示过滤行以及下面几行
grep -B ##显示过滤行以及上面几行
grep -v ##反向过滤
grep字符数量匹配规则
^westos ##以westos开头
westos$ ##以westos结尾
w…s ##w开头s结尾中间4个任意字符
…s ##s结尾前面5个任意字符
* ##字符出现任意
? ##0到1次 + ##1次到任意次
{n} ##n此
{m,n} ##m到n次 {0,n} ##0-n次
{,n} ##0-n次
{m,} ##最少m次
(lee){2} ##lee字符串出现2次

我们首先将etc下的passwd中一部分内容复制在mnt底下当做我们的实验资源,当我们使用grep命令来截取几个字符串结尾的数据时,发现不能成功完成,因为我们在这里截取的是多个字符串结尾的组合,所以我们需要使用egrep或者grep -E来完成我们的操作

[root@westos_student50 mnt]# grep "bash$|nologin$" passwd
[root@westos_student50 mnt]# egrep "bash$|nologin$" passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
westos:x:1000:1000::/home/westos:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

我们可以首先过滤文件中含有root的数据,然后使用-i来忽略大小写来进行过滤

[root@westos_student50 mnt]# grep root passwd
test:root:test
haharoot
[root@westos_student50 mnt]# grep root -i passwd
test:root:test
haharoot
test:ROOT:test

-E命令可以过滤匹配字符串前后没有其它字符的数据

[root@westos_student50 mnt]# grep -iE "\<root" passwd
test:root:test
test:ROOT:test
[root@westos_student50 mnt]# grep -iE "root\>" passwd
test:root:test
haharoot
test:ROOT:test

grep -n 可以过滤所匹配字符串上下n行的数据

[root@westos_student50 mnt]# grep -3 ROOT passwd
tcpdump:x:72:72::/:/sbin/nologin
test:root:test
haharoot
test:ROOT:test
westos:x:1000:1000::/home/westos:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

可以使用grep -n来提取匹配字符所在行并且显示行号;grep -An来显示匹配字符以及下边n行;grep -Bn来显示匹配字符以及上边n行

[root@westos_student50 mnt]# grep -n ROOT passwd
10:test:ROOT:test
[root@westos_student50 mnt]# grep -A3 root passwd
test:root:test
haharoot
test:ROOT:test
westos:x:1000:1000::/home/westos:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
[root@westos_student50 mnt]# grep -B3 root passwd
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
test:root:test
haharoot

使用grep -v命令来反向过滤不含有匹配字符的数据

[root@westos_student50 mnt]# grep -v root passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
test:ROOT:test
westos:x:1000:1000::/home/westos:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

命令练习:过滤passwd文件中行首、行尾不以root开头、结尾,行中有root关键字的行并显示
由于这个涉及到一些正则表达式的内容,所以我们在学习完全部grep的内容之后会更加熟悉

[root@westos_student50 mnt]# grep root passwd | grep -Ev "^root|root$"
test:root:test

grep后重定向到文件 grep-w_sed

我们可以使用这些正则表达式来对我们想要的数据进行匹配和显示,比如我们可以搜索含有某个规定结构字符的数据,具体如下:

[root@westos_student50 mnt]# grep -E 'h{3}m' haha
[root@westos_student50 mnt]# grep -E 'h.{3}m' haha
haahms
hahahams
hahahamsy
[root@westos_student50 mnt]# grep -E 'h.{3,}m' haha
haahms
hahahams
hahahamsy
[root@westos_student50 mnt]# grep -E 'h.{,3}m' haha
ham
hams
haahms
hahahams
hahahamsy
[root@westos_student50 mnt]# grep -E 'h.{1,3}m' haha
ham
hams
haahms
hahahams
hahahamsy
[root@westos_student50 mnt]# grep -E 'h.{2,3}m' haha
haahms
hahahams
hahahamsy
[root@westos_student50 mnt]# grep h.*m haha
ham
hams
haahms
hahahams
hahahamsy

命令练习:编写脚本显示系统中能被su命令切换的用户名称
首先我们编写脚本,搜索passwd中以sh喝bash结尾的数据,再以:为分割截取第一列,就得到了用户名称

[root@westos_student50 mnt]# vim mou.sh
[root@westos_student50 mnt]# sh mou.sh
root
westos
#!/bin/bash
grep -E "bash$|sh$"  /etc/passwd | cut -d : -f 1

2.sed

命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
对字符的处理
p ##显示
sed -n 5p westos ##显示第五行
sed -n 3,5p westos ##显示3到5行
sed -ne "3p;5p westos ##显示3和5行
sed -ne 1,5p westos ##1-5行
sed -ne ‘5,KaTeX parse error: Expected 'EOF', got '#' at position 11: p' westos #̲#5到最后以行 sed -n …d’ westos
a ##添加
sed -e ‘grep后重定向到文件 grep-w_运维_02a hello\nworld’ fstab
sed -e ‘/^#/a hello world’ fstab
c ##替换
sed -e ‘/^#/c hello world’ fstab
sed ‘5chello world’ westos
w ##把符合的行写到指定文件中
sed ‘/^UUID/w westofile’ westos ##把westos中UUID开头的行写入westosfile中 i ##插入
sed ‘5ihello westos’ westos
r ##整合文件
sed ‘5r haha’ westos
sed 字符替换
sed ‘s/: /###/g’ westos
sed ‘s/: /###/’ westos
sed ‘s/: /###/g’ westos
sed ‘1,5s/: /###/g’ westos
sed ‘1s/ : /###/g’ westos
sed ‘1s/: / ###/g;5s/: /###/g’ westos
sed ‘/lp/,/shutdown/s/: /###/g’ westos
sed ‘s///####/g’ westos
sed ‘s@/@####@g’ westos
sed ‘s@/@####@g’ -i westos 把sed处理的内容保存到westos文件中

我们之前想要查看文件中某一行的内容的时候都是先选择前几行再输出这些行中的最后一行,但是这样很多时候都很麻烦,那我们使用sed命令来查找第几行就非常方便,我们不仅可以查询第几行,哈可以查询某一行到某一行;以及我们要删除某些行再进行输出也可以很简便的做到,具体如下:

[root@westos_student50 mnt]# sed -n '4p' mmm
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@westos_student50 mnt]# sed -n '3,4p' mmm
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@westos_student50 mnt]# sed -n '3,5p' mmm
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
[root@westos_student50 mnt]# sed -n '$p' mmm
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@westos_student50 mnt]# sed -n '/root/p' mmm
     8	test:root:test
     9	haharoot
[root@westos_student50 mnt]# sed -n '3p;5p' mmm
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
[root@westos_student50 mnt]# sed '5d' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@westos_student50 mnt]# sed '6,$d' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

删除mmm中的第五行到最后一行

[root@westos_student50 mnt]# sed '5,$d' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

删除文件中含有root的行以及不含有root的行

[root@westos_student50 mnt]# sed '/root/d' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@westos_student50 mnt]# sed '/root/!d' mmm
     8	test:root:test
     9	haharoot

使用-a参数,将想要添加的内容添加在指定行之后

[root@westos_student50 mnt]# sed '$a msy you are so cool' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
msy you are so cool

使用-i参数将内容添加在指定行之前

[root@westos_student50 mnt]# sed '$i msy you are\nso cool' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
msy you are
so cool
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

将文件中第一行内容替换

[root@westos_student50 mnt]# sed '1chello\n msy' mmm
hello
 msy
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

将含有root行的内容替换

[root@westos_student50 mnt]# sed '/root/chello\nwestos' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
hello
westos
hello
westos
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

将含有root行的内容输出重定向到文件file中去

[root@westos_student50 mnt]# sed '/root/wfile' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

可以看到文件file中的数据都是含有root的行

[root@westos_student50 mnt]# cat file
     8	test:root:test
     9	haharoot

将file中的内容整合到mmm文件中来,使用-i参数就可以整合并且保存,此时查看mmm发现已经变化

[root@westos_student50 mnt]# sed '5r file' -i mmm
[root@westos_student50 mnt]# cat mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

将文件中的:替换为@;下边这个命令是在每一行前加上行号,但是它会默认单独成行,所以我们可以使用管道符给它换行

[root@westos_student50 mnt]# sed 's/:/@/g' mmm
     1	gdm@x@42@42@@/var/lib/gdm@/sbin/nologin
     2	rpcuser@x@29@29@RPC Service User@/var/lib/nfs@/sbin/nologin
     3	gnome-initial-setup@x@977@975@@/run/gnome-initial-setup/@/sbin/nologin
     4	sshd@x@74@74@Privilege-separated SSH@/var/empty/sshd@/sbin/nologin
     5	avahi@x@70@70@Avahi mDNS/DNS-SD Stack@/var/run/avahi-daemon@/sbin/nologin
     8	test@root@test
     9	haharoot
     6	rngd@x@976@974@Random Number Generator Daemon@/var/lib/rngd@/sbin/nologin
     7	tcpdump@x@72@72@@/@/sbin/nologin
     8	test@root@test
     9	haharoot
    10	test@ROOT@test
    11	westos@x@1000@1000@@/home/westos@/bin/bash
    12	mysql@x@27@27@MySQL Server@/var/lib/mysql@/sbin/nologin
    13	apache@x@48@48@Apache@/usr/share/httpd@/sbin/nologin
    14	nginx@x@975@973@Nginx web server@/var/lib/nginx@/sbin/nologin
[root@westos_student50 mnt]# sed '=' mmm | sed 'N;s/\n//g'

G表示给每一行后添加空行,$!G表示除了最后一行给每一行后边添加空行

[root@westos_student50 mnt]# sed 'G' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin

     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin

     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

     8	test:root:test

     9	haharoot

     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin

     7	tcpdump:x:72:72::/:/sbin/nologin

     8	test:root:test

     9	haharoot

    10	test:ROOT:test

    11	westos:x:1000:1000::/home/westos:/bin/bash

    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin

    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

[root@westos_student50 mnt]# sed '$!G' mmm

将第一到第五行中的:替换为@;将两个关键字所在行之间的:替换为@

[root@westos_student50 mnt]# sed '1,5s/:/@/g' mmm
     1	gdm@x@42@42@@/var/lib/gdm@/sbin/nologin
     2	rpcuser@x@29@29@RPC Service User@/var/lib/nfs@/sbin/nologin
     3	gnome-initial-setup@x@977@975@@/run/gnome-initial-setup/@/sbin/nologin
     4	sshd@x@74@74@Privilege-separated SSH@/var/empty/sshd@/sbin/nologin
     5	avahi@x@70@70@Avahi mDNS/DNS-SD Stack@/var/run/avahi-daemon@/sbin/nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@westos_student50 mnt]# sed '/rngd/,/westos/s/:/@/g' mmm
     1	gdm:x:42:42::/var/lib/gdm:/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     8	test:root:test
     9	haharoot
     6	rngd@x@976@974@Random Number Generator Daemon@/var/lib/rngd@/sbin/nologin
     7	tcpdump@x@72@72@@/@/sbin/nologin
     8	test@root@test
     9	haharoot
    10	test@ROOT@test
    11	westos@x@1000@1000@@/home/westos@/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

如果要将某几列中的字符替换,有两种方法,一种是使用:将两个替换策略分隔开,另外一种是用-e来连接两个替换策略

[root@westos_student50 mnt]# sed '1s/:/@/g;4s/:/@/g' mmm
     1	gdm@x@42@42@@/var/lib/gdm@/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd@x@74@74@Privilege-separated SSH@/var/empty/sshd@/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@westos_student50 mnt]# sed -e '1s/:/@/g' -e '4s/:/@/g' mmm
     1	gdm@x@42@42@@/var/lib/gdm@/sbin/nologin
     2	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
     3	gnome-initial-setup:x:977:975::/run/gnome-initial-setup/:/sbin/nologin
     4	sshd@x@74@74@Privilege-separated SSH@/var/empty/sshd@/sbin/nologin
     5	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
     7	tcpdump:x:72:72::/:/sbin/nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::/home/westos:/bin/bash
    12	mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
    13	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    14	nginx:x:975:973:Nginx web server:/var/lib/nginx:/sbin/nologin

如果要替换文件中的特殊字符,有两种方法,第一种是使用转译字符\来对特殊字符进行转译;第二种是将/用@替换,具体如下:

[root@westos_student50 mnt]# sed 's/\//@/g' mmm
     1	gdm:x:42:42::@var@lib@gdm:@sbin@nologin
     2	rpcuser:x:29:29:RPC Service User:@var@lib@nfs:@sbin@nologin
     3	gnome-initial-setup:x:977:975::@run@gnome-initial-setup@:@sbin@nologin
     4	sshd:x:74:74:Privilege-separated SSH:@var@empty@sshd:@sbin@nologin
     5	avahi:x:70:70:Avahi mDNS@DNS-SD Stack:@var@run@avahi-daemon:@sbin@nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:@var@lib@rngd:@sbin@nologin
     7	tcpdump:x:72:72::@:@sbin@nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::@home@westos:@bin@bash
    12	mysql:x:27:27:MySQL Server:@var@lib@mysql:@sbin@nologin
    13	apache:x:48:48:Apache:@usr@share@httpd:@sbin@nologin
    14	nginx:x:975:973:Nginx web server:@var@lib@nginx:@sbin@nologin
[root@westos_student50 mnt]# sed 's@/@##@g' mmm
     1	gdm:x:42:42::##var##lib##gdm:##sbin##nologin
     2	rpcuser:x:29:29:RPC Service User:##var##lib##nfs:##sbin##nologin
     3	gnome-initial-setup:x:977:975::##run##gnome-initial-setup##:##sbin##nologin
     4	sshd:x:74:74:Privilege-separated SSH:##var##empty##sshd:##sbin##nologin
     5	avahi:x:70:70:Avahi mDNS##DNS-SD Stack:##var##run##avahi-daemon:##sbin##nologin
     8	test:root:test
     9	haharoot
     6	rngd:x:976:974:Random Number Generator Daemon:##var##lib##rngd:##sbin##nologin
     7	tcpdump:x:72:72::##:##sbin##nologin
     8	test:root:test
     9	haharoot
    10	test:ROOT:test
    11	westos:x:1000:1000::##home##westos:##bin##bash
    12	mysql:x:27:27:MySQL Server:##var##lib##mysql:##sbin##nologin
    13	apache:x:48:48:Apache:##usr##share##httpd:##sbin##nologin
    14	nginx:x:975:973:Nginx web server:##var##lib##nginx:##sbin##nologin

小练习

命令练习:假设selinux为关闭状态,编写脚本Apache_port.sh修改http端口号
思路分析:首先检查selinux是否关闭,然后开始编写脚本,首先判断输入的端口是否为空,如果是空则报错,不为空就继续判断输入的端口是否已经被占用,如果占用则报错,否则使用sed命令将httpd服务主配置文件/etc/httpd/conf/httpd.conf中的端口设定语句替换为用户输入端口号对应的端口设定语句,最后再重启httpd服务

#!/bin/bash
[ -z $1 ] &&{
        echo "ERROR: Please input port number following script !!"
        exit
}
lsof -i:$1 > /dev/null && {
        echo "ERROR: this port is exited"
        exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

首先测试将端口改为80,发现已经被占用

[root@westos_student50 mnt]# sh Apache_port.sh 80
ERROR: this port is exited

接着改为8080端口,发现可以进行修改,最后再将改过的端口改回来,以防止发生错误

[root@westos_student50 mnt]# sh Apache_port.sh 8080
[root@westos_student50 mnt]# sh Apache_port.sh 80

3.awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR #行数
NF #列数
FILENAME #文件名称本身
westos #westos变量值
“westos” #westos字符串
/bash$/ #条件
/条件1|条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1并且条件2
$0 #所有的列
$1 #第一列
$2 #第二列
$3 #第三列

使用awk命令,首先输出westos,最后输出end,提取mmm文件中第一列

[root@westos_student50 mnt]# awk -F : 'BEGIN{print "westos"}{print $1}END{print "end"}' mmm
westos
     1	gdm
     2	rpcuser
     3	gnome-initial-setup
     4	sshd
     5	avahi
     8	test
     9	haharoot
     6	rngd
     7	tcpdump
     8	test
     9	haharoot
    10	test
    11	westos
    12	mysql
    13	apache
    14	nginx
end

用awk命令统计文件中内容行数,首先给N赋初值0,每行加一,最终输出N

[root@westos_student50 mnt]# awk -F : 'BEGIN{N=0}{N++}END{print N}' mmm
16

用awk命令,以:为分隔符,提取文件中第一列内容

[root@westos_student50 mnt]# awk -F : '{print $1}' mmm
     1	gdm
     2	rpcuser
     3	gnome-initial-setup
     4	sshd
     5	avahi
     8	test
     9	haharoot
     6	rngd
     7	tcpdump
     8	test
     9	haharoot
    10	test
    11	westos
    12	mysql
    13	apache
    14	nginx

使用awk命令以:为分隔符截取显示passwd文件中以bash结尾的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且含有root关键字的行的第一列,使用awk命令以:为分隔符截取显示passwd文件中以bash结尾或含有root关键字的行的第一列

[root@westos_student50 mnt]# awk -F : '/bash$/{print $1}' mmm
    11	westos
[root@westos_student50 mnt]# awk -F : '/bash$/&&/root/{print $1}' mmm
[root@westos_student50 mnt]# awk -F : '/bash$/&&/westos/{print $1}' mmm
    11	westos
[root@westos_student50 mnt]# awk -F : '/bash$/||/westos/{print $1}' mmm
    11	westos
[root@westos_student50 mnt]# awk -F : '/bash$/||/root/{print $1}' mmm
     8	test
     9	haharoot
     8	test
     9	haharoot
    11	westos

使用awk命令显示第七行以bash结尾的第一列

[root@westos_student50 mnt]# awk -F : '$7~/bash/{print $1}' mmm
    11	westos

练习

命令练习:统计在系统中能su切换的且用户家目录不在/home下的用户数量

在脚本中使用awk命令来将/etc/passwd中第六行不以/home开头而且不以bash或者sh结尾的行统计数量并且输出,就是能切换并且满足需求的用户数量

[root@westos_student50 mnt]# cat m.sh
#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd
[root@westos_student50 mnt]# sh m.sh
1

命令练习:统计系统内存使用总量

我们使用ps ax -o %mem可以查看系统内存使用量,我们在脚本中使用管道符加上awk命令将之前显示的每一个内存使用量中的0.0和非数字内容去掉,并且进行加和,就得到了内存使用总量

[root@westos_student50 mnt]# sh s.sh
144.5
[root@westos_student50 mnt]# cat s.sh
#!/bin/bash
ps ax -o %mem | awk 'BEGIN{N=0}!/^%mem|0.0/{N+=$1}END{print N}'