awk,sed,grep运用正则与扩展正则
1.正则与扩展正则的概述
2.示例
grep 过滤工具 ---格式:grep 【选项】 “正则表达式“ 文件 egrep 过滤工具 ---格式:egrep 【选项】 “扩展正则表达式“ 文件 head -5 /etc/passwd > user //准备素材 grep ^root user //找以root开头的行 grep bash$ user //找以bash结尾的行 grep ^$ user //找空行 grep -v ^$ user //显示除了空行的内容grep "[root]" user //找rot任意一个字符 grep "[rot]" user //效果同上 grep "[^rot]" user //显示r或o或t以外的内容 grep "[0123456789]" user //找所有数字 grep "[0-9]" user //效果同上 grep "[^0-9]" user //显示数字以外内容 grep "[a-z]" user //找所有小写字母 grep "[A-Z]" user //找所有大写字母 grep "[a-Z]" user //找所有字母 grep "[a-Z0-9]" user //找所有字母和数字 grep "[^a-Z0-9]" user //找特殊符号grep "." user //找任意单个字符,文档中每个字符都可以理解为任意字符 grep "r..t" user //找rt之间有2个任意字符的行 grep "r.t" user //找rt之间有1个任意字符的行,没有匹配内容,就无输出 grep "*" user //错误用法,*号是匹配前一个字符任意次,不能单独使用 grep "ro*t" user //找rt,中间的o有没有都行,有几次都行 grep ".*" user //找任意,包括空行 .与*的组合在正则中相当于通配符的效果grep "ro\{1,2\}t" user //找rt,中间的o可以有1~2个 grep "ro\{2,6\}t" user //找rt,中间的o可以有2~6个 grep "ro\{2,\}t" user //找rt,中间的o可以有2个以及2个以上 grep "ro\{1,\}t" user //找rt,中间的o可以有1个以及1个以上 grep "ro\{3,\}t" user //找rt,中间的o可以有3个以及3个以上 grep "ro\{2\}t" user //找rt,中间的o必须只有有2个 grep "ro\{1\}t" user //找rt,中间的o必须只有有1个 grep "ro\{3\}t" user //找rt,中间的o必须只有有3个grep "\(0:\)\{2\}" user //找连续的2个0: 小括号的作用是将字符组合为一个整体以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如 grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user 或者 egrep "ro{1,}t" user grep "ro\{1,\}t" user //使用基本正则找o出现1次以及1次以上 egrep "ro{1,}t" user //使用扩展正则,效果同上,比较精简 egrep "ro+t" user //使用扩展正则,效果同上,最精简 grep "ro\{0,1\}t" user //使用基本正则找o出现0~1次 egrep "ro{0,1}t" user //使用扩展正则,效果同上,比较精简 egrep "ro?t" user //使用扩展正则,效果同上,最精简egrep "root|^bin" user //找有root或者以bin开头的行 cat aa //素材文件,里面有一些"the" the there the6 the_ 123the egrep "the\b" aa //在aa文件中找the,右边不允许出现数字、字母、下划线 egrep "\bthe\b" aa //找the,两边都不允许出现数字、字母、下划线
sed 流式编辑器 对文档进行非交互式增删改查的操作 逐行处理 用法1:前置命令 | sed [选项] '条件指令' 用法2:sed [选项] '条件指令' 文件.. .. 选项: -n 屏蔽默认输出 -r 支持扩展正则 -i 修改源文件 指令: p 输出 d 删除 s替换 sed -n 'p' user //输出所有行 sed -n '1p' user //输出第1行 sed -n '2p' user //输出第2行 sed -n '3p' user //输出第3行 sed -n '2,4p' user //输出2~4行 sed -n '2p;4p' user //输出第2行与第4行 sed -n '2,+1p' user //输出第2行以及后面1行 sed -n '/^root/p' user //输出以root开头的行 sed -n '/root/p' user //输出包含root的行 sed -nr '/^root|^bin/p' user 将以上语句中的p指令改为d指令可以实现对应行的删除效果 比如sed -n '2p' user 改成 sed '2d' user 是删除第2行 sed -n '2!p' user //输出除了第2行的内容,加!是取反效果 sed '3,+1!d' user //删除第3行、第4行以外的行 sed -n '=' user //显示行号,=号在sed中可以显示行号 sed -n '$=' user //查看文档最后一行的行号,相当于查看文档总行数sed -i '$d' user //删除文档的最后一行并保存sed 's/2017/6666/' test.txt //把所有行的第1个2017替换成6666 sed 's/2017/6666/2' test.txt //把所有行的第2个2017替换成6666 sed '1s/2017/6666/' test.txt //把第1行的第1个2017替换成6666 sed '3s/2017/6666/3' test.txt //把第3行的第3个2017替换成6666 sed '3s/2017//3' test.txt //把第3行的第3个2017替换成空,相当 于删除 sed '/2024/s/2017/6666/' test.txt //找到有2024的行,将2017替换 成6666 ---------------------------------- 尝试将user文档中/bin/bash替换成/sbin/sh sed '1s//bin/bash//sbin/sh/' user //直接替换,报错 sed '1s/\/bin\/bash/\/sbin\/sh/' user //使用转义符号可以 成功,但不方便 sed '1s!/bin/bash!/sbin/sh!' user //最佳方案,更改s的替换符 sed '1s@/bin/bash@/sbin/sh@' user //替换符号可以用所有 数字键上的 -------------------------------------- 编写脚本,安装httpd服务,需要使用82号端口开启 #!/bin/bash yum -y install httpd &> /dev/null sed -i '/^Listen 80$/s/0/2/' /etc/httpd/conf/httpd.conf //将以Listen 80开 头的行的0换成2 systemctl restart httpd systemctl enable httpdecho "web-test~~~" > /var/www/html/index.html setenforce 0 //执行完脚本后,关闭selinux systemctl stop firewalld //关闭防火墙 curl 192.168.4.7:82 //测试82端口访问页面 sed替换的高级应用 1)删除文件中每行的第二个、最后一个字符 sed 's/.//2;s/.$//' test //分两个步骤完成,中间用分号隔开,第一步将每行的第二个任意字符替换成空,第二步将每行的最后一个任意字符替换成空即可2)删除文件中所有的数字 sed 's/[0-9]//g' nssw.txt3)将文件中每行的第一个、倒数第1个字符互换 () 保留(复制) 实现思路: echo abc > abc //创建素材 sed -r 's/(a)(b)(c)/\3\2\1/' abc //替换abc时复制每一个字符,后面替换的内容用\数字粘贴,可以任意调换位置 echo xyz >> xyz //追加内容 sed -r 's/(a)(b)(c)/\3\2\1/' abc //再用之前的方法无法替换第2行 sed -r 's/(.)(.)(.)/\3\2\1/' abc //将具体字符用 . 替代即可,然后,再将追加abcd时,上述方案失灵 sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc //再次升级,分别找到第1个字符和最后1个字符,中间可以是任意 sed -r 's/^(.)(.*)(.)$/\3\2\1/' nssw.txt //达成需求4)为文件中每个大写字母添加括号 sed -r 's/([A-Z])/(\1)/g' nssw.txt //先找到任意大写字母,然后保留,最后替换成带括号的状态编写脚本,安装httpd服务,使用82号端口 #!/bin/bash yum -y install httpd //装包 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak //备份配置文件 sed -i '/Listen 80/s/0/2/' /etc/httpd/conf/httpd.conf //修改配置文件 systemctl restart httpd //启动服务运行脚本之后,使用curl 192.168.4.7:82测试 或者火狐浏览器192.168.4.7:82 要关闭selinux与防火墙 还可以使用 netstat -ntulp |grep :82查询服务 setenforce 0 //如果脚本执行之前没关闭selinux,会报错 systemctl stop firewalld //关闭防火墙sed指令 除了p、d、s之外还有: a行下追加 i行上添加 c替换整行 sed 'a 666' user //所有行的下面追加666 sed '1a 666' user //第1行的下面追加666 sed '/^bin/a 666' user //在以bin开头的行的下面追加666 sed 'i 666' user //所有行的上面添加666 sed '5i 666' user //第5行的上面添加666 sed '$i 666' user //最后1行的上面添加666 sed 'c 666' user //所有行都替换成666 sed '1c 666' user //替换第1行为666sed 替换文件到另一个文件中的指定行 sed -i '15r a.txt' b.txt //把啊a.txt的文件替换到b.txt的15行------------------------------------------------------------------------ 编写脚本,找到系统使用bash的账户名,然后按照 用户名 --> 密码的格式存储在一个文件中 grep "bash$" /etc/passwd | sed 's/:.*//' //找到以bash结尾的用户 再用sed去掉用户后面:开始的所有内容,留下的就是用户名 sed -n '/bash$/s/:.*//p' /etc/passwd //用sed找到以bash结尾的用户 然后去掉用户后面:开始的所有内容,最后加p的作用是仅仅显示被 替换的行 #!/bin/bash u=$(sed -n '/bash$/s/:.*//p' /etc/passwd) //在文档中找到以bash结尾的行 并且将行中:以及:后面的所有内容替换为空,留下的就是用户的名字,然后将 这些名字放入变量u里面 for i in $u //把上一步找到的用户放入循环 dopass=$(grep $i /etc/shadow) //将每个人的密码信息找出pass1=${pass#*:} //掐头pass2=${pass1%%:*} //去尾,得到密码echo "$i --> $pass2" >> /opt/user.txt //按格式存在一个文档里 done
awk 精确搜索 逐行处理(二次处理) 格式1:前置指令 | awk [选项] '[条件]{指令}' 格式2:awk [选项] '[条件]{指令}' 文件 指令: print 输出 选项:-F 定义分隔符 内置变量: $1第1列 $2第2列 $3 ... $0所有列 NR行号 NF列号 awk '{print $1}' test.txt //输出所有行的第1列 awk '{print $3}' test.txt //输出所有行的第3列 awk '/the/{print $3}' test.txt //输出有the的行的第3列 awk '/the/{print NR}' test.txt //输出有the的行的行号 awk '{print NR}' test.txt //输出所有行的行号 awk '{print NF}' test.txt //输出所有行的列号 awk '{print $0,NR}' test.txt //输出所有列然后空格输出行号 head -5 /etc/passwd > user awk -F: '{print $1}' user //使用-F:修改分隔符为冒号,输出第1列 awk -F: '{print $1,$7}' user //使用-F:修改分隔符为冒号,输出第1列空格第7列 awk -F: '{print $1,"的解释器是",$7}' user //输出常量加引号 练习: 使用awk收集网卡流量信息 ifconfig eth0 | awk '/RX p/{print "服务器eth0网卡的接收流量是"$5"字节"}' ifconfig eth0 | awk '/TX p/{print "服务器eth0网卡的发送流量是"$5"字节"}' 收集根分区剩余容量 df -h | awk '/\/$/{print "根分区剩余容量是"$4}' ------------------------------------------------------------------------ awk中的条件 使用正则 ~包含 !~不包含 awk -F: '$6~/bin/{print}' user //找第6列包含bin的行 awk -F: '$6!~/bin/{print}' user //找第6列不包含bin的行 使用数字或者字符串 == != >= > <= < awk -F: 'NR==1{print}' user //输出第1行 awk -F: 'NR!=3{print}' user //输出除了第3行以外的行 awk -F: 'NR<4{print}' user //输出1~3行 awk -F: '$1=="root"{print}' user //输出第1列等于root的行 awk -F: '$1~/root/{print}' user //输出第1列包含root的行 3,逻辑组合 &&并且 ||或者 awk -F: '$3<10&&$7~/bash/' /etc/passwd //输出第3列(UID)小于10并且 第7列包含bash的行,当给了条件输出一整行时{print}可以省略不写 awk -F: 'NR>=2&&NR<=6' /etc/passwd //输出2~6行 awk -F: '$1~/root/||$3<=5' /etc/passwd //输出第1列包含root或者UID小 于等于5的行4,运算 awk 'NR%2==0' user //输出偶数行------------------------------------------------------ awk执行额外任务BEGIN{ } 执行1次,读取文档之前执行 逐行任务 执行n次 ,读取文档时执行 END{ } 执行1次,读取文档之后执行awk 'BEGIN{ }{ }END{ }' //使用时基本框架 awk 'BEGIN{print "xyz"}{print "xyz"}END{print "xyz"}' user //输出1 个xyz之后再根据user文档的行数输出5个xyz,最后再输出一个xyzawk 'BEGIN{print "User\tUID\tHome"}' //输出表头信息 awk -F: '{print $1"\t"$3"\t"$6}' user //输出内容,用户名,uid,家目录 awk 'END{print "总计"NR"行"}' user //最后输出行数awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6} END{print "总计"NR"行"}' user-------------------------------------------------------------------------------- 使用awk统计网站访问量: 开启httpd服务,80端口或者82端口都可以 使用curl 192.168.4.7:82 多访问几次网站 测试时可以关闭防火墙和selinux systemctl stop firewalld setenforce 0 awk '{print $1}' /var/log/httpd/access_log //可以找出访问者的ip,但是效果不完美,可以用后面的数组方式解决awk,for,if循环实现高级搜索awk 中使用if单分支,如果满足条件,就执行指令,不满足就不执行任何指令 if(条件){指令} awk -F: 'BEGIN{x=0}{if($7~/bash/){x++}}END{print x}' /etc/passwd //统计系统中,有多少用户使用了bash,首先定义变量x,然后使用if判断如果每找到一行的$7包含bash,就把x+1,所有逐行任务结束后,最终使用end任务输出x的值,也就是找系统中使用bash作为解释器的用户数量双分支,如果满足条件就执行指令,不满足就执行else后面的指令 if(条件){指令}else{指令} awk -F: 'BEGIN{x=0;y=0}{if($7=="/bin/bash"){x++}else{y++}}END{print x,y}' /etc/passwd //统计系统中使用bash作为解释器的用户,和没有使用bash的用户数量,使用if判断如果每找到一行的$7是/bin/bash,就把x+1,否则y+1,最后使用end输出x与y的值多分支 {if (条件){指令}else if (条件){指令}else{指令}} awk -F: '{if($7=="/bin/bash"){x++}else if($7=="/sbin/nologin"){y++}else{z++}}END{print x,y,z}' /etc/passwd //统计系统中使用bash作为解释器的用户,使用nologin的用户,还有其他用户的数量,变量如果作为运算使用,并且初始值是0的 ,可以省略定义过程数组 相当于可以存储多个值的特殊变量 数组名称[下标]=下标对应的值[root@svr7 opt]# awk 'BEGIN{a[1]=10;a[2]=20;print a[1],a[2]}' //使用awk测试数组 创建了一个数组名字叫a,分别定义两个下标与对应的两个值,然后 用print查看了a[1]的值和a[2]的值数组可以用来收集信息 for循环可以循环输出数组的下标a[abc]=0 a[abc]++ a[abc]=1 a[xyz]=0 a[xyz]++ a[xyz]=1 a[abc]=1 a[abc]++ a[abc]=2 awk '{a[$1]++}END{print a["abc"],a["xyz"]}' abc.txt //根据上述结果,得到如果 使用{a[$1]++}走完所有行便可收集到a[xyz]=1和a[abc]=2的结果,所以 在最后使用END任务输出a[abc]和a[xyz]的值就是 2和 1awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc.txt //使用for循环,循环显示 数组a的下标,与值,其中for(i in a)里面的i是变量,代表下标,in是语法不 能变,a是数组名awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log //将上述 的abc.txt文件替换成网站的日志,就可以最终用来查看日志得到可以得到 哪个ip来访以及来访的次数awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log | sort -nr 查看日志中某个ip的出现次数,以及ip,然后按降序排列,出现次数最大的 显示在第一行,sort命令可以实现排序效果,-n是以数字排序,-r是降序awk '/Failed password for root/{ip[$11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure //查看哪个ip登录root账户时输入错了密码,先输出次数,再输出ip编写监控脚本,可以查看各种服务器的信息 #!/bin/bash while : do clear //清屏 ifconfig eth0 | awk '/RX p/{print "服务器eth0网卡的接收流量是"$5"字节"}' ifconfig eth0 | awk '/TX p/{print "服务器eth0网卡的发送流量是"$5"字节"}' df -h | awk '/\/$/{print "根分区剩余容量是"$4}' awk 'END{print "服务器账户总数是"NR"个"}' /etc/passwd echo "当前已登陆账户数量是$(who | wc -l)个" free -h | awk '/^Mem:/{print "服务器内存剩余容量是"$4}' uptime | awk '{print "cpu的15分钟平均负载是"$NF}' echo "服务器安装软件包数量是$(rpm -qa | wc -l)个" sleep 3 //休息3秒 done
awk,sed,grep运用正则与扩展正则相关推荐
- awk,sed,grep基本用法列举
点击下方链接了解awk,sed,grep awk,sed,grep 关注公众号,即可获得更多笔记哟
- 基础正则和扩展正则的作用
*基础正则表达式:basic regular expression BRE 包括:^ $ . [] [^] 和扩展正则不同的是grep和sed不需要加参数也可以使用 ^ ^d 以d开头的行,例如:ls ...
- Linux的正则语法,vim跟三大剑客(awk sed grep)
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- awk,sed,grep
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...
- [笔记]使用shell命令(awk,sed,grep)处理几个特征字符串之间的文本
问题一:提取一行文本之中几个特征字符串之间的文本. 例:从文本 "/directory1/WantedString/directory2" 中提取"directory1/ ...
- linux里的葫芦娃----awk ,sed,grep
准备: 创建测试文件,分隔符为制表符"\t": 第二个测试文件 先说说grep: 查找出文件aaa.txt中的日期格式字段 接下来结合cut使用一下: 先找到系统文件/etc/pa ...
- awk sed grep find sort常用配搭用法
secooler itpub http://space.itpub.net/519536/viewspace-557309 来自 " ITPUB博客 " ,链接:http://bl ...
- Linux命令:grep awk sed详解
1.grep grep [options] regex [file...] regex 是指一个正则表达式 -i : 忽略大小写.不会区分大小写字符.也可用–ignore-case 来指定. -v : ...
- sed grep awk之间比较
文章来源:http://blog.csdn.net/zzhays/article/details/7875549 正则表达式基础 在最简单的情况下,一个正则表达式看上去就是一个普通的查找串.例如,正则 ...
最新文章
- Bitmap那些事之内存占用计算和加载注意事项
- linux网络编程-----TCP连接及相关问题
- listview滚动到底部
- SAP成都研究院DevOps那些事
- 基于VHDL超声波测距实验
- Object.assign()解释整理
- c++获取子类窗口句柄位置_干货分享:用一百行代码做一个C/C++表白小程序,程序员的浪漫!...
- mysql binlog c++_关于MySQL的日志管理(binlog)
- 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
- NA Express
- 二维码图片处理换logo,加文字
- Liferay layout_configuration 分析
- google Chrome 浏览器升级更新了来源策略,导致不同域名来源页面信息【Referer】只有域名信息
- 使用java压缩文件成zip——三种方式压缩文件速度对比
- 案例实战|泰坦尼克号船员获救预测(数据预处理部分)
- CSDN,一个可能即将被遗忘的角落
- Vue从零开始(2):使用Vue CLI快速生成项目脚手架
- 微信公众号与微信小程序如何相辅相成的?
- android hwcomposer
- https://www.cnblogs.com/richered/p/8344087.html