shell脚本-正则、grep、sed、awk三剑客

tech2023-12-26  73

一、正则表达式及grep; 二、sed流编辑器; 三、awk:报告生成器; 四、awk的高级用法;

正则表达式:可以帮助运维,从过多的文件内容当中,获取你想要的任何数据 1、正则表达式应用非常广泛,存在于各种语言中,例:PHP、Python、JAVA、Perl等。但是,Linux 系统中的正则表达式,最常应用正则表达式的命令就是grep(egrep)、awk、sed,Linux三剑客想要更高效的工作,离不开正则表达式的配合。 2、正则表达式与常用的通配符特殊字符是有本质区别的,一定要注意。 3.基础正则表达式: ^word 搜索以word开头的。vi/vim中 ^ 一行的开头。 word$ 搜索以word结尾的。vi/vim中 $ 一行的结尾。 ^$ 表示空行 . 代表且只能代表任意一个单个字符 \ 例:. 只代表点本身,转义符号,让有特殊身份意义的字符,脱掉马甲,还原; \n 换行符 \r 匹配回车 \w 匹配任意一个字符和数字 * 重复0次或多次前面的一个字符。 .* 匹配所有字符。例:^.* 以任意多个字符开头,.*$以任意多个字符结尾。 [abc] 匹配字符集内的任意一个字符。 [^abc] 不要abc这三个字符排列组合成的任意一个字符串。中括号里的 ^ 为取反。 [1-9] 只要包含1-9之内的数字,就打印该行 a{n,m} 重复n到m次前一个重复的字符。若用egrep、sed -r可以去掉斜线。 {n,} 重复至少n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线。 {n} 只打印前边出现n次的字符。若用egrep、sed -r可以去掉斜线 {,n} 打印前边的那个最多出现n次的字符

注:egrep,grep –E或sed –r 过滤一般特殊字符可以不转义 注:egrep,grep –E或sed –r 过滤一般特殊字符可以不转义。 4.扩展的正则表达式:ERE(egrep或grep -E) + 重复一次或一次以上前面的一个字符。等同于{n,} ? 重复0次或一次前面的一个字符。等同于{,m} | 或者的意思,用或的方式查找多个符合的字符串。 () 找出括号内的字符串。 二、sed流编辑器 语法:sed 选项 ‘操作符’ 文件名 选项: -n sed默认输出全部内容,-n只输出匹配到的内容; -i 修改文件内容; -r 支持扩展正则表达式; -e 匹配多个command 操作符: a 在当前行的下一行添加内容 c 将选定行替换为指定内容 d 删除选定的行 i 在当前行的上一行添加内容 p 打印指定行内容 s 替换选定字符为指定字符 三、awk:报告生成器: 1.awk的作用:一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入stdin、一个或多个文件,或其它命令的输出。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。擅长取行、取列、过滤。 2.语法: awk [选项] ‘模式{ 动作(action) }’ 文件1 文件2 … 选项: -F 指定输入分隔符,可以是字符串或正则表达式; 最常见的动作: print、printf Awk以-F为域分隔符,当分隔符为空格的时候,是不用写-F的 3.awk的基本原理特征: 1)每一次取一行 2)根据指定的分隔符(不指定是位空白字符)将该行切割位列,使用$0(整行),$1,$2,$3…(第一列,第二列,…) tail -1 /etc/passwd |awk -F ‘:’ ‘BEGIN{OFS="—"}{print $1,$6,$7}’ ##OFS指定输出分隔符 ifconfig eth0 |awk ‘NR2 {print $2}’ ifconfig eth0 |awk 'NR2 {print “eth0_ip=”$2}’ ##可以加入显示内容 awk ‘BEGIN {print “line one \nline two\nline three”}’ awk -F’:’ ‘BEGIN {print “line one \nline two\nline three”,OFS="----------"}’’{print $1,$2}’‘END {print “line one \nline two\nline three”}’ /etc/passwd awk -F’:’ ‘BEGIN {print “############”}’’{print $1,$2}’‘END {print “----------”}’ /etc/passwd 5.匹配范围(ranges):指定的匹配范围,格式为part1,part2 案例: awk -F : ‘$33,$310{print $1,$3,$7}’ /etc/passwd #查询UID为3到10之内的用户 awk -F : ‘$1==“root”,$1==“adm”{print $1,$3,$7}’ /etc/passwd awk -F : ‘/r/,/a/{print $1,$3,$7}’ /etc/passwd awk -F ‘:’ ‘($7!~"/sbin"){print $1,$7}’ /etc/passwd ##查找$7不包含/sbin作为条件,进行打印 awk -F ‘:’ ‘($7!="/bin/bash")&&($7!="/sbin/nologin"){print $1}’ /etc/passwd ##查找$7不等于/bin/bash并且$7不等于/sbin/nologin作为条件,进行打印 awk -F ‘:’ ‘($5~“99999”)&&($2==""){print $1,$5}’ /etc/shadow 含99999并且$2等于作为条件,进行打印; 注解: $1=="" ##精确匹配等于 $1!="" ##精确匹配不等于 $1~"" ##包含匹配等于 $1!~"" ##包含匹配不等于 6.awk区块原理: 区域构成: BEGIN { 动作 } ##开始处理第一行文本之前的操作 { 动作 } ##针对每一行文本的处理操作 END { 动作 } ##处理完最后一行文本之后的操作 执行流程: 首先执行 BEGIN { } 区块中的初始化操作; 然后从指定的数据文件中循环读取一个数据行(自动更新 NF、 NR、 $0、 $1…… 等内建变量的值),并执行’模式或条件{ 动作 }’; 最后执行 END { } 区块中的后续处理操作。 案例: awk -F : ‘BEGIN{printf “%-10s%-10s%-20s\n”,“UserName”,“ID”,“Shell”}{printf “%-10s%-10s%-20s\n”,$1,$3,$7}’ /etc/passwd ##在awk处理之前打印头部BEGIN{}

ifconfig eth0 |awk -F’:’ ‘NR==2{print $2,$4}’|awk ‘BEGIN{OFS=" / "}{print “IP=”$1,“MASK=”$3}’

7.awk的变量: awk变量: FS:列分隔符,默认位空白 相当于选项-F RS:行分隔符,默认位换行符 OFS:输出列分隔符 ORS :输出行分隔符 awk内置变量: NR:处理中行数 FNR:单个文件的行数 NF:列的个数 案例: ifconfig eth1 |awk ‘{print NR}’ ifconfig eth1 |awk ‘{print NF}’ 自定义变量案例: awk ‘BEGIN{test=“www.linuxfan.cn”;print test}’ awk -v test=“linuxfan.cn” ‘BEGIN{print test}’ 8.printf的使用: 格式:printf “格式”,列表1,列表2 … 特征: a.必须指定format(格式),用于指定后面item(列表)的输出格式 b.printf语句不会自动打印换行符:\n c.format格式以%加一个字符,如下: %c:显示字符的ASCII码 %d,%i:十进制整数 %f:显示浮点数(小数) %s:显示字符串 %u:无符号整数 %%:显示% d.修饰符:N:显示宽度,-:左对齐,+:显示数值符号,如%-c(左对齐) 案例: chkconfig --list |grep 3:启用 |awk ‘{printf “%-10s”,$1}’ ##在统一行显示 awk -F : ‘{printf “%-15s %-10d %-10s\n”,$1,$3,$7}’ /etc/passwd

9.awk的操作符: 算数操作符: x^y、x/y、x+y、x-y、x%y

比较操作符:>、<、>=、<=、==、!= 逻辑操作符:&&(逻辑与)、||(逻辑或)、!(逻辑否)

10.awk常见的模式类型 正则表达式(regexp):awk -F : ‘/^u/{print $1}’ /etc/passwd 表达式(expression):值位非0或位非空是满足条件,如$1 ~ /foo/或 $1 == “root” 案例: awk -F : ‘$3>=500{print $1,$3,$7}’ /etc/passwd ##打印普通用户 awk -F : ‘$3+1<=100&&$3+1>=10{print $1,$3,$7}’ /etc/passwd ##UID在10-100之间的用户 awk -F : ‘$3>=9 && $3<=99 {print $1,$3,$7}’ /etc/passwd

awk -F : ‘$2=="!!"{print $1,$2}’ /etc/shadow ##检查未初始化密码的用户 passwd -d u01 awk -F : ‘$2==""{print $1}’ /etc/shadow ##打印密码为空的用户 awk -F : ‘ 7   " b a s h 7~"bash 7 "bash"{print $1,$3,$7}’ /etc/passwd ##匹配$7为bash结束行 awk -F : ‘ 7 !   " b a s h 7!~"bash 7! "bash"{print $1,$3,$7}’ /etc/passwd

四、awk的高级用法: 1.if-else:判断 语法:if (条件表达式) 命令 操作1; else 命令 操作2 案例: awk -F : ‘$7~“bash”{if ($1==“root”) print $1, “admin”;else print $1, “Common User”}’ /etc/passwd ##第七列是bash,如果第一列是root打印root admin,否则打印出第一列 common user awk -F : -v sum=0 ‘{if ($3>=500) sum++}END{print sum}’ /etc/passwd ##输出普通用户的数量 awk -F : ‘ 7   " b a s h 7~"bash 7 "bash"{if ($1==“root”) printf “%-15s: %s\n”,$1,“admin”;else printf “%-15s: %s\n”,$1,“common user”}’ /etc/passwd ##使用printf打印

2.while循环:循环字段(列),awk本身就是行的循环 语法:while (条件){语句1;语句2;… 案例: awk -F: ‘{i=1;while (i<=3) {print KaTeX parse error: Expected 'EOF', got '}' at position 6: i;i++}̲}' /etc/passwd …i)<=4) print $i;i++}}’ /etc/passwd ##循环整行,并打印出长度小于4的字段列

3.for:循环 语法:for (初始变量;条件;变量 自加){语句1, 语句2,…} 案例: awk -F : ‘{for(i=1;i<=3;i++) print $i}’ /etc/passwd

最新回复(0)