Linux中的文本处理工具
一.grep
1.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 ##反向过滤
2.实验
242 grep root /etc/passwd //含有root的行
244 grep -E "root|nologin" passwd //含有root和nologin的行
245 grep -e root -e bash passwd //含有root和bash的行
246 grep -i root passwd //忽略大小写查找含root的行
247 grep -E "\<root\>" passwd //root前后都不能有字符的行
248 grep -n halt passwd //显示halt所在的行号
249 grep -5 halt passwd //显示含有关键字的前后各5行
250 grep -B5 halt passwd //含有关键字的前5行
251 grep -A5 halt passwd //含有关键字的后5行
252 grep root passwd -v //反选,不含有关键字的行
3.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次
4.实验
265 touch westosfile2
266 vim westosfile2
ws
was
wbs
waas
waaas
waaaas
waaaaas
wabababs
267 cat westosfile2
268 grep ws westosfile2
269 grep w.s westosfile2 //ws之间一个字符
270 grep w..s westosfile2 //ws之间两个字符
271 grep w...s westosfile2 //ws之间三个字符
272 grep -E "w.{2}s" westosfile2 //ws之间两个字符
273 grep -E "w.*s" westosfile2 //ws之间任意个字符
274 grep -E "wa*s" westosfile2 //ws之间任意个a
275 grep -E "wa{2}s" westosfile2 //ws之间两个a
276 grep -E "wa{1}s" westosfile2 //ws之间1个a
277 grep -E "wa{,1}s" westosfile2 //ws之间0-1个a
280 grep -E "wa?s" westosfile2 //ws之间任意个a
281 grep -E "wa+s" westosfile2 //ws之间1-任意个a
282 grep -E "wa{1,}s" westosfile2 //ws之间1-任意个a
283 grep -E "wa{1,2}s" westosfile2 //ws之间1-2个a
284 grep -E "wa{,2}s" westosfile2 //ws之间0-2个a
285 grep -E "wa{2,}s" westosfile2 //ws之间2-任意个a
286 grep -E "w(ab){2,}s" westosfile2 //ws之间2-任意个ab
5.练习脚本
请显示系统中能被su命令切换的用户名称
vim check_su.sh
#! /bin/bash
grep -E "bash$|sh$" /etc/passwd | cut -d: -f 1
sh check_su.sh
二.sed
1.命令格式
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
2.对字符的处理
(1)p命令
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 ##显示以#开头的行
(2)d
d ##删除
sed 5d westos ##删除第五行
sed '/^#/d' fstab ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos
(3)a
##添加
sed -e '$a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab
(4)c
c ##替换
sed -e '/^#/c hello world' fstab
sed '5chello world' westos
(5)w
w ##把符合的行写到指定文件中
sed '/^UUID/w westofile' westos ##把westos中UUID开头的行写入westosfile中
sed '/nologin$/w westosfile' passwd //将passwd中的以nologin结尾的写入westosfile中
(6)i
i ##插入
sed '5ihello westos' westos
sed '/westos/i westoslinux' westos 在westos中的westos前面插入westoslinux
sed '/westos/a westoslinux' westos 在westos中的westos后面插入westoslinux
(7)r
r ##整合文件
sed '5r haha' westos
(8)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 's/a/b/g' test //g表示全局替换
sed 's/a/b/' test //表示替换每一行的第一列
sed 's/sbin/westos/g' passwd //全局的sbin替换成westos
sed '4,5s/sbin/westos/g' passwd //4,5行的sbin替换成westos
sed '$s/sbin/westos/g' passwd //最后一行的sbin替换成westos
sed '/lp/,/halt/s/sbin/westos/g' passwd//lp和halt之间的sbin替换成westos
sed 's/\//#####/g' passwd //全局的/替换成#
sed 's@/@#####@g' passwd //全局的/替换成#
sed 's@/@#####@g' -i passwd //替换的内容保存在原文件中
(9)练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080
脚本:
vim Apache_port.sh
setenforce 0 &> /dev/null
[ -z "$1" ] && {
echo "Error:PLease input port number!!!"
exit
}
rpm -q httpd &> /dev/null || {
echo "Error: Apache is not running!"
exit
}
systemctl status httpd | grep "running" &> /dev/null || {
echo "Error : Apache is not running!!"
exit
}
netstat -antlupe | grep -E ":$1\>" &> /dev/null &&{
echo "Error:$1 is in used!"
exit
}
sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
netstat -antlupe | grep http
三.awk
1.命令参数
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 #第三列
2.命令示范
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd /etc/passwd文件的第六列没有home关键字并且以bash结尾的行
360 awk -F : BEGIN{print"name"}{print$1}END{print"end"} passwd //begin是运行策略之前的动作,字符串不加引号表示变量,加引号表示字符串本身。{print $1}表示处理动作,end后面接处理结束做的事情
361 awk -F: '{print NR}' passwd //打印行数
362 awk -F: '{print NF}' passwd //打印列数
363 awk -F: '{print FILENAME}' passwd //打印文件名
364 awk -F: 'BEGIN{westos=1}{westos++}END{print westos}' passwd //每处理一行westos加1,最后打印westos的值
365 awk -F: '/nologin$/{print $1,$7}' passwd //打印一nologin结尾的所有的行
366 awk -F: '/nologin$|^root/{print $1,$7}' passwd //两个条件或的关系
367 awk -F: '/nologin$/||/^root/{print $1,$7}' passwd //两个条件或的关系
368 awk -F: '/nologin$/&&/^root/{print $1,$7}' passwd //两个条件且的关系
369 awk -F: '/bash$/&&/^root/{print $1,$7}' passwd //两个条件且的关系
370 awk -F: '$7~/bash$/{print $0}' passwd //第七列以bash结尾的打印
371 awk -F: '$7!~/bash$/{print $0}' passwd //第七列不是bash结尾的打印
3.课后练习
(1)统计在系统中能su切换的并且用户加目录不在/home下的用户数量
381 awk -F: 'BEGIN{N=0}$6!~/\/home/&&/bash$|sh$/{N++}END{print N}' passwd
(2)一条awk命令就打印出ens3的ip信息
ifconfig ens3 | awk '/\<inet\>/{print $2}'