文章概要:本文主要介绍shell脚本中的三剑客,grep、sed、awk的使用。
一.grep使用
1.1 egrep和grep的使用
筛选出文本中指定条件的行:以行为单位,逐行进行处理,默认只"输出"与表达式相匹配的"文本行"。 egrep:扩展正则,grep:基本正则。
1.2 语法
egrep [参数] '正则(单引号)' 文件
[参数]说明:
(1)-i:忽略大小写(2)-v:去反(3)-c:统计匹配的行数(4)-q:无任何输出,一般用于检测命令是否执行成功(5)-n:显示出匹配结果所在行号(6)--color:标红显示匹配字符串
1.3 符号匹配规则
1.3.1 整体 和 或匹配
(1)(ab):匹配包含(ab)的行
(2)| : root | bin :匹配root或者bin
1.3.2 行首尾及单字匹配
(1)^:匹配以什么开头(^abc:以abc开头的行)
(2)$:匹配以什么结尾(abc$:以abc结尾的行)
(3).:匹配任意单个字符
1.3.3 未定匹配次数
(1)+:至少匹配1次( (ab)+:一个或者多个连续的ab)
(2)?:最多匹配1次(a?:0个或1个a)
(3)*:代表次数,匹配前一个字符的0或任意次数(不可单独使用)
1.3.4 {}限定次数匹配
(1)(){n}:匹配n次( (ab){2}:匹配abab)
(2)(){n,m}:匹配n-m次数 ( (ab){1,2}:匹配ab,abab)
(3)(){n,}:至少匹配n次( (ab){2,}:匹配abab及以上的连续)
1.3.5 []范围内单字匹配:[]内可加^取反[^]
(1)[a3?]:匹配a,3,?的行 == .
(2)[a-z]:匹配任意小写字母的行
(3)[A-Z]:匹配任意大写字母的行
(4)[0-9]:匹配任意数字的行
(5)[a-Z0-9]:匹配任意数字或者字母的行
(6)[^A-Z]:匹配包括非大写字母的行
(7)^[^a-z]:匹配非小写字母开头的行
1.3.6 转义字符的边界匹配
(1)\b:单词边界,\broot\b,严格匹配root
(2)\<:单词开头,\<th,th开头的单词
(3)\>:单词结束,一般与\<结合使用,\<root\> 等同于 \broot\b
(4)\w:匹配数字,字母,下划线,所在行,
(5)\s:匹配空白所在行,
(6)\d:匹配[0-9]的数字=[0-9],用法:grep -P '\d' user
二.sed的使用
2.1 作用:
非交互式对文本进行增,删,改,查等操作,
逐行处理,将结果输出到屏幕
每个指令之间用//分隔:sed -rn "/^(root)|^(bin)/p" user
2.2 语法:
格式1:(单引号)
sed [参数] '/条件/和指令' 文件 (条件为行号或者/正则/(扩展正则加上-r),指令为参数)
格式2:
命令 | sed [参数] '条件和指令'
参数说明
(1)-n:屏蔽输出,不加默认输出全部原文内容(2)-r:启用扩展的正则表达式,不写支持基本(3)-i:修改原文件内容,不加的时候所有操作只输出效果,不改原文件
指令说明
(1)p:(查)打印行,2,4p:打印2,3,4行,2p;4p:打印2行4行 sed -rn "/1/p" user(2)d:(删)删除行,(!d删除不包含什么的行),2,4d:删除2,3,4行(3)s:(改)替换,不加-n内容全部输出逐行替换(4)sed文本块处理:增(1)i:行前面插入文本,2ixx:在第2行前添加文本xx(2)a:行后插入文本,2axx:在第2行后添加文本xx(3)c:替换当前行,2cxx:将第二行的内容替换为xx
2.3 sed与正则结合例子:
sed -rn '/xx/s/2017/2002/g a.txt:找含有xx的行,将里面的所有2017替换成2002
2.4 sed特殊用法
(1)sed -n '1!p' 文件名: 输出除了第一行的内容,!表示取反
(2)sed -n '$p' xx :输出最后一行
(3)sed -n '=' xx :输出行号,$=:输出最后一行的行号
(4)sed -n '1~2p' xx :打印奇数行,1为基准,~2,起跳2行
三.awk的使用
3.1 作用
将满足条件的行和列内容输出
3.2 语法
(1) awk [参数] '条件{指令}' 文件,{}表达式语句块
(2) 前置命令 | awk [参数] '条件{指令}' 文件
参数说明
-F:指定分隔符,(省略默认为空格或者Tab位)-F"[:/]":指定多个分隔符号
3.3 awk行列与正则的组合:正则前面有其它操作
(1)~:正则匹配操作符
awk -F: '$1~/root/{print}' a.txt:这里的~表示连接正则
3.4 awk内置变量
(1)FS:与-F一样
(2)$0:当前读入的整行内容
(3)$num:第num列内容,如$1,$3分别表示第1列与第3列
(4)NF:当前行的总列数,awk '{print $NF}' b打印最后一列
(5)NR:当前的行数
3.5 awk条件设置
(1) ==, !+, >, <, >=, >=
(2)&&, ||
(3)+, -, *, %, /, ++, --...
例子:awk 'NF==2{print}' a.txt :打印第二行
3.6 awk数组
(1)定义: 数组名[下标]=元素值
(2)遍历数组
awk 'BEGIN{a[0]=11;a[2]=33;for(i in a) {print i,a[i]}}'
(3)统计某一个ip出现次数:
awk '{IP[$1]++}END{for(i in IP)print i"访问次数为:"IP[i]}' ip.txt