#grep命令
命令格式: grep 匹配条件 处理文件
grep root passwd 过滤passwd文件中的root关键字,只有小写
grep -i root passwd -i忽略大小写,此时大写ROOT也会被过滤出来
grep -E "\<root" passwd root字符之前不能有字符
grep -E "root\>" passwd root字符之后不能有字符
-v参数,反向过滤,即过滤出没有root的
-n,显示过滤行的行号以及内容,-n -3则为显示过滤行和上三行和下三行内容,-n -A3则只显示上三行,-n -B3则只显示下三行。
grep字符数量匹配规则
grep ^westos file 过滤file文件中以westos开头
westos$ 以westos结尾
w....s 以w开头s结尾,中间四个任意字符,几个点就是几个任意字符。
* 为字符出现任意多次,如grep -E "w.*s" file 过滤file文件中以w开头s结尾中间任意个字符
? 为0到1次,如"we?s"为w开头,s结尾,中间e只能为0个或1个。
+ 为1到多次,与*区别是*包括0次,+至少为1。
{n}n次
{m,n} m到n次
{0,n} 0到n次,或{,n}
{m,} 最少m次,m到多次
(lee){2} lee字符串出现两次
练习:显示系统中能被su命令切换的用户名称
grep -E "\<bash$|\<sh$" /etc/passwd | cut -d : -f 1
#sed命令
命令格式:sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
sed 's/nologin/westos/g' passwd 把passwd中所有nologin换成westos;或者vim rules,把规则写入文件中s/nologin/westos/g,然后sed -f rules passwd 。
对字符的处理
p 显示
sed 5p passwd 把passwd文件的第五行多显示一次
sed -n 5p passwd 只显示第五行
sed -n 3,5p passwd 只显示第三行到第五行
sed -ne "3p;5p" passwd 只显示第三行和第五行
sed -ne '/^r/p' passwd 只显示以r开头的行
sed -ne '/bash$/p' passwd 只显示以bash结尾的行
sed -ne '/bash$/!p' passwd 只显示不以bash结尾的行
sed -ne '$p' passwd 只显示最后一行
d 删除
sed 5d passwd 删除第五行
sed '3,5d' passwd 删除第三行到第五行
sed -e '3p;5d' passwd 删除第三行和第五行
sed -e '/^r/d' passwd 删除以r开头的行
sed -e '/bash$/d' passwd 删除以bash结尾的行
sed -e '/bash$/!d' passwd 删除不以bash结尾的行
a 添加
sed '2ahello wesots' fstab 在fstab文件第二行添加hello westos
sed '2ahello\nwesots' fstab 在fstab文件第二行添加多行,\n换行,hello和westos
sed '$ahello\nwesots' fstab 在fstab文件最后一行添加
sed '/#/ahello\nwesots' fstab 在fstab文件中所有含#的行后添加
c 替换
sed '/sbin/chello' passwd 把passwd文件中所有含有sbin的行替换成hello
sed '/^r/chello' passwd 把passwd文件中所有以r开头的行替换成hello
sed '$chello' passwd 把passwd文件中最后一行替换成hello
w 把符合条件的行写入指定文件中
sed '/bash/w testfile' passwd 把passwd文件中所有含有bash的行写入到testfile文件中
i 插入
sed '/see/ihello fstab 在fstab文件中所有含see的行前插入hello(a是在行后添加)
sed '1ihello fstab 在fstab文件中第一行插入hello(1a其实是在第一行后添加,为第二行)
r 整合文件
cat test1 test2把test1(内容为123)和test2(内容为456)整合到一起显示(123456),tac test2 test1 即为反向显示 (654321),这种方法整合只能在后面插入整合
sed '1r 789test2' test1 即把test2整合到test1的第一行后面(178923456)
注:文件中的每一个数字独占一行。
sed字符替换
sed 's/:/@/g' passwd 把passwd文件中所有行的:替换为@
sed '1,5s/:/@/g' passwd 把passwd文件中第一行到第五行的:替换为@
sed '/r/s/:/@/g' passwd 把passwd文件中含有r行中的:替换为@
sed '/root/,/daemon/s/:/@/g' passwd 把passwd文件中root到daemon行中的:替换为@
sed -e '7s/:/@/g;$s/:/@/g' passwd 把passwd文件中第七行和最后一行中的:替换为@
以上替换并未改变文件原内容
sed 's/#//g' -i passwd 把passwd文件中所有#替换为空,即删除,并保存。
注:其中的//可以用@代替,效果一致,如sed 's@#@@g' -i passwd等同于 sed 's/#//g' -i passwd
sed 's/\//#/g' passwd 把文中/替换为#,\为转义字符。等同于sed 's@/@#@g' passwd
练习:
写脚本Apache_port.sh,脚本接入数字,http端口就改为该数字端口
如shh Apahce_port.sh 8080 ,Apache端口就被修改为8080
#awk
awk -F 分隔符 BEGIN{} {}END{} FILENAME
awk -F : 'BEGIN{print "start"}{print $1}END{print "end"} passwd
开始时输出start,然后输出passwd文件的第一列,结束后输出end,-F指定以冒号为分隔符,$1为第一列,$2则为第二列以此类推,$0为所有的列。{print $1,$3}则为输出第一列到第三列。
awk -F : 'BEGIN{print "start"}{print NF}END{print "end"} passwd (NF输出文件中所有行的列数,即每一行有多少列;NR则输出所有列的行数,即行号;FILENAME则输出指定文件的名称,即passwd;)
awk -F : '/bash/{print $1}' passwd输出包含bash的第一列。
awk -F : '/bash|nologin/{print $1,$7}' passwd 一个条件内两个元素或者关系
awk -F : '/bash/||/nologin/{print $1,$7}' passwd 两个条件或者关系
awk -F : '/bash/&&/nologin/{print $1,$7}' passwd 两个条件并且关系
awk -F : '$7~/bash/{print}' passwd 指定第七列含有bash的行
awk -F : '$7!~/bash/{print}' passwd 指定第七列不含有bash的行
练习:
统计在系统中能su切换并且家目录不在/home下的用户数量
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd
冒号分隔,第六列不以/home开头并且不以bash或sh结尾的,开始N为0,符合条件则N加一,输出N