9.1正则接受_grep{上}
9.2grep{中}
9.3grep{下}
9.4sed{上}
9.5sed{下}
9.6awk{上}
9.7awk{下}
正则接受_grep{上}
正则介绍
- 正则就是一串有规律的字符串
- 掌握好正则对编写shell脚本有很大帮助
- 各种编程语言中都有正则,原理是一样的
- 常用的工具有grep/egrep、sed、awk
grep
- grep [-cinvABC] '关键词' filename
- -c 行数,过滤出的行一共月多少行
- -i 不区分大小写
- -n 显示行号
- -v 取反
- -r 遍历所有子目录
- -A 后面跟数字,过滤出符合要求的行以及下面n行
- -B 同上,过滤出符合要求的行以及上面n行
- -C 同上,同时过滤出符合要求的行以及上下各n行
- 过滤指定的关键词,格式为:grep [-cinvABC] '关键词' filename
- -c:表示打印符合要求的行数
- -n:表示输出符合要求的行及行号
- -i:不区分大小写
- -v:取反,打印不符合要求的行
- -r:遍历所有子目录
- -A :后面跟一个数字,过滤出符合要求的行以及下面n行
- -B:后面跟一个数字,过滤出符合要求的行以及上面n行
- -C:后面跟一个数字,过滤出符合要求的行以及上下各n行
grep{中}
- grep '[0-9]':表示过滤出包含数字的所有行
- grep -vn '[0-9]':表示过滤出不包含数字的所有行
- grep -n '^#':表示过滤出所有已#开头的行,^表示以什么开头,-v 过滤所有不已#开头的行
- grep '[^0-9]':表示过滤掉所有数字,^在中括号里表示非的意思
- grep '^[^0-9]':表示过滤出以非数字开头的行
- grep -v '^[^0-9]':表示过滤出以数字开头的行
grep{下}
- . 表示任意一个任意字符
- * 表示零个或多个*前面的字符
- .* 表示通配,所有的都匹配
- {} 表示范围,{}花括号前面字符的一个范围
- +表示一个或多个+号前面的字符
- ?表示0个或一个问号前面的字符
- |表示或者
grep 'r.o':表示过滤出任意的一个字符, . 表示任意一个字符
grep 'o*o':表示过滤出零个到多个o(*前面的字符)
grep '.*':表示过滤出任意字符
grep 'o\ {2\ }' :表示过滤出指定字符出现的次数,{}可以是一个范围,如'o\ {0,3\ }
两种表示方法:egrep 'o{2 }' grep -E 'o {2 }' 扩展 或者 -E
grep 'o\+o'或者egrep 'o+o' +号代表前面一次或者多次o 大于1,要用egrep 或者拖义\
grep 'o?t':表示过滤出零个到1个o,前面字符的0或者1
grep -E 'root|nologin' ,|表示或者的意思
sed{上}
- sed与grep比较,sed能实现grep功能,但是比较麻烦,而且没有颜色显示;sed优势在于替换一些指定的字符。
- 用sed实现grep匹配的功能,匹配关键词用 '//'p ,-n作用是只显示我们要打印的行
- sed还支持. * + 等特殊符号 +号得加-r参数
- sed -nr '/o{2}/'p test.txt,匹配两次o
- sed -nr '/root|bus/'p test.txt,匹配或者的用法
- sed -n '2'p test.txt ,打印指定的行 sed -n '2,5'p test.txt,打印2-5行;sed -n '20,$'p test.txt,打印25行到末行,$表示末行
- sed -n '1,$'p test.txt,全部打印出来
- sed -e用法,在一行里执行多条命令
- sed -e '1'p -e '/bus/'p -n test.txt,先打印第一行,然后再匹配含有bus的行
sed{下}
- sed -n '/bus/'Ip test.txt,匹配不区分大小写
sed删除指定的行
- sed '1,25'd test.txt,删除1-25行,实际上并没有删掉文件内容,列出剩下的行
- 加上-i,可以直接删除文件内容
- sed查找替换,与vim类似;sed '1,10s/root/toor/g' test.txt,s表示替换关键词,g表示全局替换
- sed -r '1,10s/ro+/r/g' test.txt,替换的字符串能识别正则表达式
- head test txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' ,替换前十行第一段和最后一段字符串的位置,以冒号为参考对象,小括号里的内容用\1、\2、\3表示
- head test txt |sed 's/\/root/123/g' ,将/root替换成123,要用脱义符号\
- 或者把分隔符/换成#和@来区分
- head test txt |sed 's/[a-zA-Z]//g'删除文件中所有英文字母
- head test txt |sed -r 's/(.*)/aaa:&/'在所有行前面加上固定字符串,&表示前面小括号内的内容
awk{上}
- awk兼具sed的所有功能,而且还支持分段
截取文档中某个段
- 打印文档中的某段,-F作用是指定分隔符
- 打印所有的段awk -F ':' '{print $0}' test.txt
- 打印文件的全部内容awk '{print $0}' test.txt,不需要加F,类似于cat查看文件
- awk如果不指定分隔符,则默认空格或空白为分隔符
- 打印多段内容awk -F ':' '{print $1,$2,$4}' test.txt
- 打印内容可以指定#来分割,需要用到双引号
awk匹配功能
- awk '/oo/' test.txt ,匹配包含oo的行
- awk -F ':' '$1 ~ /oo/' test.txt ,打印第一段中包含oo的行,~表示匹配
- awk -F ':' '$1 ~ /o+/' test.txt ,匹配第一段中包含o的行,支持正则表达式,出现特殊符号时,awk不用加脱义字符,grep和sed则必须要加脱义字符
- awk支持多个表达式一起写
针对数学表达式的用法
- awk -F ':' '$3==0' test.txt,匹配第3段等于0的
- 只要第一段加{print $1}
- awk -F ':' '$3>=1000 {print $1}' test.txt,匹配第3段大于等于1000的,并打印所有段
- awk -F ':' '$3>="1000"{print $0}' test.txt ,“1000”是以ASC码值进行排序的,被认为是字符串,需求是针对数字的不要加双引号
- awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt,匹配出第7段不是/sbin/nologin的所有段,!=表示不匹配
awk{下}
- awk -F ':' '$3<$4' test.txt,匹配比较第3段小于第4段的行;
- ;awk -F ':' '$3==$4' test.txt,匹配出第3段和第4段相等的行,==就是等于,精确匹配
- awk -F ':' '$3>"5" && $3<"7"' test.txt,匹配第3段大于5的,和小于7的行,&&表示并且的意思
- awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt,匹配第3段大于1000的,或者第7段等于/sbin/nologin的所在的行,|| 表示 或者 的意思
- awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt,匹配第3段大于1000的,或者第7段包含/bash/的
awk的内置变量
- awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1 $3 $7}' test.txt,先写OFS中间写条件最后写print语句
- awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}' test.txt.匹配第3段大于1000,然后打印第1,第2,第3,第4段内容, 并用#分割
- PFS是print打印时指定的那个分割符{都是数字的}
- NR 表示行{都是数字的}
- NF 表示段{都是数字的}
awk -F ':' '{print NR":"$0}' test.txt ,NR表示行号
awk -F ':' '{print NF":"$0}' test.txt,NF表示用分隔符分割后每一行一共有多少段
awk -F ':' 'NR<=10' test.txt,打印前10行,awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt,匹配前10行中,第1段包含root或者sync的
awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt,匹配文件中是6段的,并在第1段包含root或者sync的
awk -F ':' '{print $NR":"$NF}' test.txt,
head -n 3 /etc/passwd |awk -F ':' '$1="root" ',在前3行中,给第1段赋值为root
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt,tot值求和,tot默认0开始,每次和新的第三段值相加,最终第三段值加完,输出tot值
课堂笔记
awk语法结构:
awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}' filename
打印某行到某行之间的内容
sed -n '/tss/,/sas/p' /etc/passwd
sed转换大小写
1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
3. 大写变小写:
sed 's/[A-Z]/\l&/g' filename
sed在某一行最后添加一个数字
sed -r 's/(^a.*)/\1 12/' test
sed -r 's/^a.*/& 12/' test
打印1到100行含某个字符串的行
sed -n '1,100{/abc/p}' 1.txt
awk 中使用外部shell变量
a=2; echo "a:b:c:d"|awk -F ":" -v get_a=$a '{print $get_a}'
awk 合并一个文件
awk 'NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$1]}' 1.txt 2.txt
说明:
awk '{print NR,FNR}' 1.txt 2.txt //首先理解NR和FNR的不同(awk支持同时操作多个文件内容)
当NR==FNR其实就是第一个文件的内容
当NR>FNR,其实就是第二个文件的内容
把一个文件多行连接成一行
方法一:
a=`cat file`;echo $a
方法二:
awk '{printf("%s ",$0)}' file
方法三:
cat file |xargs
awk中gsub函数的使用
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc
awk 截取指定多个域为一行
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in `seq 1 7`
do
awk -F ':' -v a=$i '{printf $a " "}' /etc/passwd
echo
done
过滤两个或多个关键词
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式
awk用print打印单引号
awk 'BEGIN{print "a'"'"'s"}'
awk 'BEGIN{print "a'\''s"}'
awk 'BEGIN{print "a\"s"}'
- 打印某行到某行之间的内容http://ask.apelearn.com/question/559
- sed转换大小写 http://ask.apelearn.com/question/7758
- sed在某一行最后添加一个数字http://ask.apelearn.com/question/288
- 删除某行到最后一行 http://ask.apelearn.com/question/213
- awk 中使用外部shell变量http://ask.apelearn.com/question/199
- awk 合并一个文件 http://ask.apelearn.com/question/493
- 把一个文件多行连接成一行 http://ask.apelearn.com/question/266
- awk中gsub函数的使用 http://ask.apelearn.com/question/200
- awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
- 过滤两个或多个关键词 http://ask.apelearn.com/question/198
- 用awk生成以下结构文件 http://ask.apelearn.com/question/5494
- awk用print打印单引号 http://ask.apelearn.com/question/1738
- 合并两个文件 http://ask.apelearn.com/question/945
- awk的BEGIN和END http://blog.51cto.com/151wqooo/1309851
- awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html