1、grep
grep -E = egrep
##grep 格式##
grep 匹配条件 处理文件
grep root passwd #过滤root关键字
grep ^root passwd ##以root开头
grep root$ passwd ##以root结尾
grep -i root passwd ##后略大小写
grep -E "\<root" passwd ##root字符之前不能有字符
grep -E "root\>" passwd ##root字符之后不能有字符
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n lp passwd ##显示匹配的行所在行号
grep -2 lp passwd ##显示过滤行以及上下2行
grep -A2 lp passwd ##显示过滤行以及下面2行
grep -B2 lp passwd ##显示过滤行以及上面2行
grep -v lp passwd ##反向过滤
grep -E "bash|root" passwd
grep字符数量匹配规则
^westos ##以westos开有
westos$ ##以westos结尾
w....s ##w开头s结尾中间4个任意字符
.....s ##s结尾前面5个任意字符
* ##字符出现1任意
? ##0到1次
+ ##1次到任意次
{n} ##n此
{m,n} ##m到n次
{0,n} ##0-n次
{,n} ##0-n次
{m,} ##最少m次
(lee){2} ##lee字符串出现2次
476 grep root passwd
477 grep ^root passwd ##以root开头
478 grep root$ passwd ##以root结尾
479 vim passwd
480 grep root$ passwd
481 grep root passwd | grep -E "^root|root$"
482 grep root passwd | grep -E "^root|root$" -v ##root在中间
483 vim passwd
484 grep r...t passwd ##r开头t结尾中间3个任意字符
485 grep r*t passwd
486 grep r.*t passwd ##点的个数是任意多个
487 grep r*.t passwd ##r的个数是任意多个
488 grep r*..t passwd
490 grep -E "ro?t" passwd ##o 0到1次
491 grep -E "ro{,1}t" passwd
492 grep -E "ro{,2}t" passwd ##o 0到2次
493 grep -E "ro+t" passwd ##o 1次到任意次
494 grep -E "ro{2,3}t" passwd ##o 2-3次
495 grep -E "rost" passwd
496 vim passwd
497 grep -E "rost" passwd
498 grep -E "ros*t" passwd
499 grep -E "r(os)*t" passwd
500 vim passwd
502 grep -E "r(os)*{2}" passwd
503 grep -E "r(os){3}t" passwd ##os字符串出现3次
练习脚本:
请显示系统中能被su命令切换的用户名称
[root@node1 mnt]# grep -E "bash$|sh$" /etc/passwd | cut -d : -f 1
root
westos
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,$p’ westos ##5到最后以行
sed -n ‘/^#/p’ fstab ##显示以#开头的行
d ##删除
sed 5d westos ##删除第五行
sed ‘/^#/d’ fstab ##把#开头的行删除
sed ‘/^UUID/!d’ fstab ##除了UUID以外的行都删除
sed -e ‘5,$d’ westos
[root@localhost mnt]# sed 's/sbin/westos/g' passwd ##sbin替换为westos
[root@localhost mnt]# vim rule
s/sbin/westos/g
[root@localhost mnt]# sed -f rule passwd
[root@localhost mnt]# cat -n /etc/fstab > westos1
[root@localhost mnt]# sed 5p westos1 ## 复制第5行
[root@localhost mnt]# sed -n 5p westos1 ## 显示第5行
[root@localhost mnt]# sed -n 5,9p westos1 ## 显示5到9行
[root@localhost mnt]# sed -ne '5p;9p' westos1 ## 显示5和9行
[root@localhost mnt]# sed -ne '5,$p' westos1 ## 5到最后一行
[root@localhost mnt]# cat /etc/fstab > westos
[root@localhost mnt]# sed -n '/^#/p' westos ## 只显示#开头的行
[root@localhost mnt]# sed -n '/^#/!p' westos ## 不显示#开头的行
[root@localhost mnt]# sed 'G' westos ## 每行前面加一个空行
[root@localhost mnt]# sed -ne '/^#/!p' westos | grep -E '^$' -v ##
[root@localhost mnt]# sed 5d westos1 ## 删除第五行
[root@localhost mnt]# sed '$d' westos1 ## 删除最后一行
[root@localhost mnt]# sed '/#/d' westos1 ## 删除带#的行
a ##添加
sed -e '$1a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab
sed '5ahello westos' passwd
sed '/sync/ahello westos' passwd
sed '$ahello westos' passwd
sed '1,5ahello westos' passwd
sed -e '1ahello westos' -e '5ahello westos' passwd ##1行和5行后添加
添加在指定行的下一行
c ##替换
[root@server3 mnt]# sed '5chello westos' passwd
[root@server3 mnt]# sed '/sbin/chello westos' passwd
替换字符阿在行,替换一整行。
w ##把符合的行写到指定文件中
sed ‘/^UUID/w westofile’ westos ##把westos中UUID开头的行写入westosfile中
i ##插入
插入在指定行的上一行
r ##整合文件
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 统计行号
sed '=' passwd ##显示行号
sed '$=' passwd
sed -n '$=' passwd
sed '=' passwd | sed -e 'N;s/\n/ /g' ##换行符替换为空格
练习及脚本
Apache_port.sh
此脚本后接入数字
http的端口就改为此数字
假设selinux为关闭状态
[root@node1 mnt]# vim Apache_port.sh ## " "弱引用
#!/bin/bash
sed ''/^Listen/c Listen $1'' -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
firewall-cmd --permanent --add-port=$1/tcp
firewall-cmd --reload
[root@node1 mnt]# sh Apache_port.sh 8080
Warning: ALREADY_ENABLED: 8080:tcp
success
success
[root@node1 mnt]# netstat -antlupe | grep http
tcp6 0 0 :::8080 :::* LISTEN 0 115190 4380/httpd
3.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 #第三列
[root@server3 mnt]# awk -F : '/bash$|sh$/{print $1}' /etc/passwd
root
westos
第五列为空
课后练习:
统计杂在系统中能su切换的并且用户加目录不在/home下的用户数量
[root@node1 mnt]# useradd linux -s /bin/sh -d /mnt/home
useradd: user 'linux' already exists
[root@node1 mnt]# userdel -r linux
[root@node1 mnt]# useradd linux -s /bin/sh -d /mnt/home
[root@node1 mnt]# awk -F : 'BEGIN{n=0}/sh$|bash$/&&$6!~/^\/home/{n++}END{print n}' /etc/passwd
2