文本处理工具

一、grep

grep可以对文件内容或者输出内容进行搜索,常用于抓取包含指定字符的内容。并且具有贪婪性。

1. 匹配条件

grep root passwd                  ##显示含root关键字的行
grep -e root -e nologin passwd    ##含有root和弄login的行
grep -i root passwd               ##-i忽略大小写
grep -E "\<root" passwd           ##匹配字符不能有前缀
grep -E "root\>" passwd           ##匹配字符不能有后缀
grep -E "\<root\>" passwd         ##字符前后都不能有后缀,单纯为root
grep -n westos passwd             ##-n显示匹配的行所在行号
grep -3 westos passwd             ##显示过滤行及前后5行将会显示
grep -B3 westos passwd            ##显示含有关键字的行及以上3行
grep -A3 westos passwd            ##显示含有关键字的行及以下3行
grep -v root passwd               ##显示不含有root的过滤行,-v反选

2.字符数量匹配规则

grep ^root westos                ##以root开头的行
grep root$ westos                ##以root结尾的行
grep w.s westos                  ##ws之间有任意一个字符的
grep w...s westos                ##ws之间有任意三个字符的
grep -E "w.*s" westos            ##表示字符出现了任意次
grep -E "wa*s" westos            ##a出现了任意次
grep -E "wa{2}s" westos          ##a出现了两次
grep -E "wa?s" westos            ##a出现了0-1次
grep -E "wa+s" westos            ##a出现一次以上
grep -E "wa{3,}s" westos         ##a最少3次
grep -E "wa{,3}s" westos         ##a最多3次
grep -E "wa{1,3}s" westos        ##a出现1-3次
grep -E "w(ab){3,}s" westos      ##ab最少3次

练习:把可以用su切换的用户过滤出来

grep -e sh$ -e bash$ /etc/passwd | cut -d : -f 1

二、sed

sed可以对文件内容或者输出内容进行操作,并显示结果。

1. p 显示

sed -n 5p passwd		      ##显示第5行
sed -n 2,5p passwd		      ##显示2到5行
sed -n '3p;5p' passwd		  ##显示3和5行
sed -n '/^root/p' passwd	  ##显示以root开头的行
sed -n '/root$/p' passwd	  ##显示以root结尾的行
sed -n '$p' passwd            ##显示最后一行

2. d 删除

cat -b passwd | sed '5,8d'      ##删除5-8行
cat -b passwd | sed '5d;8d'     ##删除5和8行
sed '/^root/d' passwd           ##删除以root开头的行
sed '/bash$/d' passwd           ##删除bash结尾的行

3. a 添加

sed '2a ooooo' passwd              ##在第2行之后添加ooooo
sed '/^westos/a ooooo' passwd      ##在以westos开头的行后加ooooo
sed '$a ooooo' passwd              ##最后一行后添加

4. c 替换

sed '/^westos/c aaaaaa' passwd   ##将最后一行替换成aaaaaa

5. w 保存

sed '$w file' passwd    ##将最后一行保存到file文件中

6. i 插入

sed '1i hhhhh' passwd     ##在第一行前插入hhhhh

7. r 整合

sed '/bash$/r file1' passwd     ##将file1中的内容整合到以bash结尾的行后面

8. s 替换字符

sed 's/bash/oooo/g' passwd       ##将全部内容的bash换成oooo
sed '2,5s/sbin/oooo/g passwd     ##将2-5行的sbin换成oooo
sed '$s/bash/ooop/g' passwd      ##换最后一行
sed 's/\//##/g' passwd           ##将/换成##,\转译
sed 's@/@##@g' passwd            ##同上
sed 's@/@##@g' -i passwd         ##-i 保存到原文件

练习:

Apache_port.sh,此脚本接入数字,http的端口就改为此数字,假设selinux为关闭状态。需考虑是否输入端口数字、是否安装httpd、httpd是否正在运行、所输入端口是否被占用。

#!/bin/bash
setenforce 0 &> /dev/null

[ -z "$1" ] && {
        echo "Errow:Please input port following script !!"
        exit
}

rpm -q httpd &> /dev/null || {
        echo "Errow:Apache is not installed !!"
        exit
}

systemctl status httpd | grep "running" &> /dev/null || {
        echo "Eroow:Apache is not running !!"
        exit
}

netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
        echo "Errow: $1 is in used !! "
        exit
}

sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

netstat -antlupe | grep http

三、awk

 awk会文件内容或输出内容的每一行进行读取,然后根据筛选条件和处理动作进行操作,并显示结果。

格式:awk -F 分隔符 'BEGIN{  }{  }END{  }' filename   ##BEGIIN{}为处理动作前的策略,{}为处理动作END{}为处理动作后的策略

awk -F : 'BEGIN{print "name"}{print $1}END{print "end"}' passwd   ##先打印name,显示每行的第一列,再打印end。""表示字符串本身,不是变量
awk -F : '{print NG}' passwd                                      ##打印行数
awk -F : '{print NF}' passwd                                      ##打印每行列数
awk -F : 'BEGIN{westos=1}{westos++}END{print westos}' passwd      ##westos为变量,可统计总行数
awk -F : '/bash$/{print $1,$4}' passwd                            ##过滤以bash结尾的行,打印第1列与第4列
awk -F : '/bash$|^nobody/{print $1,$4}' passwd                    ##过滤条件为以bash结尾或者以nobody开头
awk -F : '/bash$/||/^nobody/{print $1,$4}' passwd                 ##同上表或者
awk -F : '/bash$/&&/^root/{print $1,$4}' passwd                   ##表并且,需同时满足
awk -F : '$7~/bash$/{print $0}' passwd                            ##过滤第七列是以bash结尾的行,打印所有列。$0表所有列
awk -F : '$7!~/bash$/{print $0}' passwd                           ##!表反选

练习:

1. 统计在系统中能su切换的并且用户加目录不在/home下的用户数量

awk -F : 'BEGIN{n=0}$6!~/^\/home/&&/bash$|sh$/{n++}END{print n}' /etc/passwd  ##root用户一个

2. 用awk命令抓ens3的ip

ifconfig ens3 | awk '/\<inet\>/{print $2}'     ##不用-F则默认分隔符为空格

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值