linux cpu占用率如何看
291
2022-11-11
正则表达式和四剑客
正则表达式: 不是一个工具程序,而是一个字符串处理的标准依据,是使单个字符串搜索、匹配一系列符号某个语法规则的字符串。
正则表达式的作用: 1、测试字符串的模式,数据验证 2、替换文本 3、基于匹配模式去文本文件中提取出符合条件的内容
正则表达式:用来查找文件内容、文本、字符串,一般只支持四剑客grep、egrep、sed、awk 通配符:用来查找文件或者目录的,普通命令都支持。find
正则表达式分类: 基础正则表达式:BRE,常用的正则表达式 扩展正则表达式:ERE,对于基础正则表达式的扩充和深化
linux文本处理工具: vi/vim编辑器 grep(只支持基础正则表达) egrep(支持扩展正则表达) sed(支持扩展正则表达) awk(支持基础正在表达支持扩展正则表达式)
字符串匹配的模式: 作用:用来检查一个串是否包含某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 通配符: ?:匹配文件名中含有0个或者1个字符 *:匹配0个或多个字符,一般以......开头 find / -name “a?” find / -name “a*”
^[0-9]+abc$ 注: ^:以什么开头 [0-9]:代表数字,匹配单个数字 +:配置多个,匹配多个数字 abc$:以abc结尾 ^[a-z0-9_-]{3,15}$ 注: ^[a-z0-9_-]:^代表以什么开头;a-z代表字母a-z;0-9代表数字0-9;下划线;连字符 {3,15}:3~15字符的长度 $:代表结束标记
基础正则表达式的元字符:
元字符 | 作用 |
---|---|
\ | 转义字符,用于取消特殊符号的含义,如:!、\n等 |
^ | 匹配字符串的开始位置,如:^world匹配以world开头的行 |
$ | 匹配字符串的结束位置,如:world$匹配以world开头的行 |
. | 匹配除\n(换行)之外的任意一个字符 |
* | 匹配前面的子表达式0次或者多次 |
[list] | 匹配list列表中的一个字符,如:[0-9]匹配任一位数字 |
[^list] | 匹配不在list列表中的一个字符,如:[^0-9]匹配任意一位非数字字符 |
{n} | 匹配前面的子表达式n次,如:[0-9]{2}匹配两位数字 |
{n,} | 匹配前面的子表达式不少于n次,如:[0-9]{2,}表示两位及两位以上数字 |
{n,m} | 匹配前面的子表达式n到m此,如:{a-z}{2,3}匹配两到三位的小写字母 |
扩展正则表达式的元字符:
元字符 | 作用 |
---|---|
+ | 匹配前面表达式1次以上,如:go+d,将匹配至少一个o |
? | 匹配前面的子表达式0次或者1次,如go?d,将匹配gd或god |
() | 将()号中的字符串作为一个整数,如:(xzy)+,将匹配xyz整体1次以上 |
管道符号 | 以或的方式匹配字符串,如:good管道符号great,将匹配good或者great |
四剑客:grep、egrep、sed、awk
grep工具 -i:忽略大小写 -v:取反 过滤出 过滤掉 grep ‘root’ /etc/passwd //筛选文件中包含root的行 grep -v ‘root’ /etc/passwd //筛选文件中不包含root的行 注:-v 表示过滤掉,不显示出来 grep ‘r..d’ /etc/passwd //筛选r和d之间有两个字符的行 grep ‘[^s]bin’ /etc/passwd //筛选bin前面不是s的行 grep ‘^$’ /etc/passwd //筛选出空白行 grep ‘t[es]’ /etc/passwd //筛选包含字符串te或ts的行 grep ‘0\{1,\}’ /etc/passwd //查找数字0出现1次及以上的行 grep -e "root;sshd" 文件名 grep -e ‘root’ -e ‘sshd’ /etc/passwd //查找root和sshd的行,-e参数查找多个模式 grep ’[^a-z]ae’ /etc/passwd //筛选ae前面不是小写字母的行 grep ’^[a-z]ae’ /etc/passwd //筛选ae前面是小写字母的行 注:当使用连续的字符时,小写字母[a-z],大写字母[A-Z],数字[0-9] grep ’o*’ /etc/passwd //匹配所有内容(若有空白行的文件,甚至包括空白行) 注:oo*匹配至少包含一个o的行(第一个o必须出现,第二个o可出现0次或多次)
egrep工具 egrep '0+' /etc/passwd //匹配至少包含一个0的行 egrep ‘(root|ntp)’ /etc/passwd //匹配包含root或者nto的行 egrep ‘ro?t’ /etc/passwd //匹配rt或者rot的行 egrep -v ‘^$|^#’ /etc/passwd //过滤文件中空白行与#开头的行,没有空白行与#号开头的行,所以没有任何输出
sed工具概述 sed是文本处理工具,读取文本内容,根据指定的条件进行处理,如删除,替换,添加等 可在无交互的情况下实现相当复杂的文本处理操作 被广泛应用于shell脚本,已完成自动化处理任务 sed依赖于正则表达式
sed命令语法: sed -e ‘编辑指令’ 文件1 文件2... 注:-e,在’编辑命令’中有”;”来分隔执行命令 sed -n -e ‘编辑指令’文件1 文件2... -n只显示过滤出内容 sed -i -e ‘编辑指令’ 文件1 文件2... -i:流编辑器,读一行处理一行
sed命令格式: 编辑命令格式:[地址1,[地址2]]操作[参数] “地址”,可数字、正则表达式、$,如果没有地址代表是所有行 “操作”,可以是p、d、s、r、w、i等 “参数”,一般有g,代表只要符合条件的全部进行处理(g全部) 常用操作: p:输出指定的行 d:删除指定的行 s:子串替换,格式:”行范围s/旧字符串/新字符串/g” r:读取指定条件 w:保存为文件 i:插入,在当前行前面插入一行或多行 输出指定的行: sed -n ‘p’ /etc/passwd //将所有内容输出 cat sed -n ‘-7p’ /etc/passwd //将第7行内容输出 sed -n ‘$p’ /etc/passwd //将最后一行输出 sed -n ‘1,7{p;n}’ /etc/passwd //将1~7行中的奇数行输出 sed -n ‘1,7{n;p}’ /etc/passwd //将1~7行中的偶数行输出 sed -n ‘1,+4p’ /etc/passwd //从第1行,连续4行进行输出 sed -n ‘/root/p’ /etc/passwd //将匹配包含root的行进行输出 sed -n ‘10,/nom/p’ /etc/passwd //将从第10行至第一个包含nom的进行输出 sed -nr ‘/ro{1,}t/p’ /etc/passwd //匹配不少于1次前导字符0,加-r参数支持扩产展正则表达式 rot root sed -n’/root\|ntp/p’ /etc/passwd //输出包含root或者ntp的行 注:如果遇到特殊符号,扩展正则需要转义符”\” sed -n ‘/root/=’ /etc/passwd //将包含root所在的行行号输出,“=”用来输出行号 sed -e ‘5q’ /etc/passwd //输出前五行信息后退出,q退出 sed -e ‘5p ; 7p;9p’ /etc/passwd //输出5行、7行、9行信息插入符合条件的行:
插入符合条件的行: sed ‘root/i admin:x:490:490::/:/sbin/nologin’ /etc/passwd //在包含root行的前面一行插入admin:x:490:490::/:/sbin/nologin sed ‘/root/a admin:x:490:490::/:/sbin/nologin’ /etc/passwd //在包含root行的下一行插入admin:x:490:490::/:/sbin/nologin sed ‘3aADMIN’ /etc/passwd //在第3行之后插入ADMIN 删除符合要求的行: sed ‘1d’ /etc/passwd //删除第一行 sed ‘$d’ /etc/passwd //删除最后一行 sed ‘/^$/d’ /etc/passwd //删除所有空行 sed ‘2,4d’ /etc/passwd //删除第2到4行 sed ‘/root/d’ /etc/passwd //删除包含root的行,这里的”i”表示取反操作 sed ‘/^root/d’ /etc/passwd //删除以root开头的行 sed ‘/nologin$/d’ /etc/passwd //删除以nologin结尾的行替换成符合条件的文本: sed ‘s/root//g’ /etc/passwd //将文件中所有的root都替换成空 加g替换所有 s:全部内容 sed ’/root/c admin:x:490:490::/:/sbin/nologin’ /etc/passwd //将含有root的行为替换为admin:x:490.... sed -n ‘s/root/admin/2p’ /etc/passwd //把每行的第2个root替换成admin sed ’/root/s/root/ROOT/g’ /etc/passwd //将第1~3行中的所有bin都替换成BIN sed ‘s/$/ABC/’ /etc/passwd //在每行行尾插入字符串ABC sed ‘s/^/#/’ /etc/passwd //在每行行首插入#号 sed ‘/root/s /^/#/’ /etc/passwd //将包含root的行的行首插入#号 sed ‘1c ABC’ /etc/passwd //将第一行替换成ABC sed ‘y/root/ROOT/’ /etc/passwd //将root对应替换为ROOT y:对应替换 sed ‘/1,10y/root/ROOT/’ /etc/passwd //将第1~10行中的root对应替换为ROOT
迁移符合条件的文本: sed ‘15,16 w out.txt’ test.txt //另存为 sed ‘5r /etc/reslov.conf’ test.txt //将/etc/reslov.conf内容读取的当前文件第五行后面 sed ‘1,5{H;d};$G’ test.txt //将第1~5行内容迁移至末尾 注:H,复制到缓冲区。G,追加到指定行后 sed ‘/^ip/s/^/#/’ test.txt //在以ip开头的行的行首插入# sed ‘1,5H;15,16G’ test.txt 执行多次命令: sed -ne ‘s/root/admin/’ -ne ‘s/bash/sh/p’ /etc/passwd //将root和bash动作替换 sed -ne ‘s/root/admin/;s/bash/sh/p’ /etc/passwd //将root和bash动作替换 直接修改文件内容: 有-i直接修改原文件,保存修改后的文件 sed -i ‘s/^/#/’ /etc/passwd //在每行开头插入#号,直接修改原文件
awk工具介绍 awk也是一个功能强大的编辑工具,与sed一样,可在无交互的情况下实现相当复杂的文本操作 命令格式: awk 选项 '模式或条件 {编辑指令}’ 文件1 文件2 awk -f 脚本文件 文件1 文件2 工作原理: 逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
awk内置变量 FS:指定每行文本的字段分隔符,缺省为空格或制表位。 注:默认分隔符为空格 等同于-F NF:当前处理的行的字段个数 NR:当前处理的行的行号(序数) $0:当前处理的行的整行内容 $n:当前处理行的第n个字段(第n列)
案例: awk -F: '{print $0,NF}' /etc/passwd //输出以冒号为分隔的/etc/passwd文件中记录的字段段数 df -hT |awk '{print $1,$6}' //用awk截取命令df -hT输出的结果,不带任何条件,进行格式化,打印第1列和第6列数据 awk '{print $0}' /etc/passwd //输出所有内容 cat /etc/passwd grep "" /etc/passwd sed -n 'p' /etc/passwd //输出所有内容
打印文本内容: awk 'NR==1,NR==3{print}' bfile //输出第1至第3行内容 awk 'NR==1||NR==3{print}' bfile //输出第1行、第3行内容 awk '/^root/{print}' /etc/passwd //输出以root开头的行 awk '/nologin$/{print}' /etc/passwd //输出以nologin结尾的行 awk '(NR>=1)&&(NR<=3){print}' /etc/passwd //输出第1行到第3行内容 awk "(NR%2)==1{print}' /etc/passwd //输出所有奇数行的内容 awk '(NR%2)==0{print}' /etc/passwd //输出所有偶数行的内容 awk -F: '!($3<900)' /etc/passwd //输出第3个字段不小于900的行,“!”号表示取反
在使用awk的过程中,可以使用关系运算符作为“条件”,用于比较数字与字符串,运算符大于(>)、小于(<)、小于等于(<=)、等于(==)、不等于(!=) 也可使用逻辑操作符&&,表示“与”,||表示“或”,!表示“非” 还可以进行简单的数学运算加(+)、减(—)、乘(*)、除(/)、取余(%)、乘方(^)。 只有当条件为真,才执行指定的动作。
awk -F: '{if($3>200)print $0}' /etc/passwd //输出第3个字段大于200的行 awk -F: '{max=($3>$4)?$3:$4;print max}' /etc/passwd //如果第3个字段的值大于第4个字段的值,则把问号前表达式的值赋给max,否则就将冒号后那个表达式的值赋给max awk -F: '{max=($3>200)?$3:$1;print max}' /etc/passwd //如果第3个字段的值大于200,则把第3个字段的值赋给max,否则就将第1个字段的值赋给max 在使用awk过程中还可以使用条件表达式,条件表达式的运算涉及两个符号,冒号和问号,其实质就是if...else语句的捷径,有着if...else相同的结果
接字段输出文本 awk -F: '{print NR,$0}' /etc/passwd //输出处理数据的行号,每处理完一条记录,NR值加1 awk -F":" '$3<5{print $1 $3}'/etc/passwd //输出第3列小于5的第1列与第3列数据 awk -F ":" '($1~"root")&&(NF==7){print $1,$3}'/etc/passwd //输出包含7个字段,并且第1个字段中包含root的行第1与第2字段内容 awk -F":" 'NR==3,NR==7{print $1,$7}' /etc/passwd //输出第3行到第7行中以冒号为分隔符的第1列与第7列的数据 输出数据时插入文本标签: awk -F: '/^root/{print "Hi," $1}' /etc/passwd //输出以冒号为分隔符,以root开头的行第一列,且在前面插入“Hi,” awk '{print $1"--"$3}' 6.txt //输出第一列和第二列并加入普通字符 引号引用普通字符 awk -F":" '$7~"/bash"{print $1}' /etc/passwd //输出冒号分隔且第7个字段中包含/bash的行的第1个字段 awk -F':''{print $1":"$2":"$3":"$4}' /etc/passwd //保留原来的格式,输出以冒号为分隔,/etc/passwd文件的前4个字段 awk -F":" '{print $1,$3}' /etc/passwd //输出以冒号为分隔符的第1列和第3列 awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd //输出以冒号为分隔符的第1列和第3列 awk 'BEGIN{X=0};/\/bin\/bash$/{x++};END{printx}' /etc/passwd //统计以/bin/bash为结尾的行数
awk执行顺序:首先执行BEGIN{}中的操作,然后从指定的文件中逐行读取数据,自动更新NF、NR、$0、$1等内建变量的值,去s执行'模式或条件{编辑指令}’;最后执行END{}操作 处理命令输出的结果: date |awk '{print "Month:"$2"\nYear:"$6}' //输出日期的第2列且在前面插入Month:,换行输出第6列并在前面插入Year
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~