第五期 shell 正则表达式(grep egrep sed awk)(第十一 十二讲)

一、grep/egrep 1. 语法+选项语法: grep  [-cinvABC]  ‘word‘  filename (尽量用单引号)

---color 打印出来用红色显示

alias cgrep=‘grep --color‘

vim ./bashrc

-c :打印符合要求的行数-n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行  -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 -r : 会把目录下面所有的文件全部遍历


-q :表示能过滤到东西,但不显示。

-o:把符合条件的一小部分列出来。

2. 例子介绍过滤出带有某个关键词的行并输出行号 grep -n ‘root‘ 1.txt 过滤出不带有某个关键词的行并输出行号grep -n -v ‘root‘ 1.txt过滤出所有包含数字的行 grep ‘[0-9]‘ 1.txt过滤出所有不包含数字的行 grep -v ‘[0-9]‘ 1.txt去除所有以‘#‘开头的行 grep -v ‘^#‘ 1.txt去除所有空行和以‘#‘开头的行 grep -v ‘^$‘ 1.txt|grep -v ‘^#‘过滤出以英文字母开头的行 grep ‘^[a-zA-Z]‘ 1.txt过滤出以非数字开头的行 grep ‘^[^0-9]‘ 1.txt过滤任意一个或多个字符 grep ‘r.o‘ 1.txt; grep ‘r*t‘ 1.txt; grep ‘r.*t‘ 1.txt  . 表示任意一个字符;*表示零个或多个前面的字符 ;.*表示零个或多个任意字符,空行也包含在内 指定过滤字符次数 grep ‘o\{2\}‘ 1.txt

如果用egrep就不用加

egrep ‘0{2}‘ 1.txt

还有加号+ 和?

grep  -E "r?o" 1.txt  表示0个后者1个前面字符

grep -E "r+o" 1.txt  表示1个或者1个以上的前面的字符

3. egrepegrep工具 是grep工具的扩展egrep ‘o+‘ 1.txt   表示1个或1个以上前面字符egrep ‘o?‘ 1.txt  表示0个或者1个前面字符egrep ‘roo|body‘ 1.txt  匹配roo或者匹配bodyegrep ‘r(oo)|(at)o‘ 1.txt 用括号表示一个整体

包含/bin/并且包含post的


cgrep -E ‘sbin‘ 1.txt | cgrep ‘post‘ 并且的意思


egrep ‘(oo)+‘ 1.txt 表示1个或者多个 ‘oo‘ 4. . * + ? 总结. 表示任意一个字符(包括特殊字符)* 表示零个或多个*前面的字符.* 表示任意个任意字符(包含空行)+ 表示1个或多个+前面的字符? 表示0个或1个?前面的字符其中,+ ? grep不支持,egrep才支持。

grep -e 相当于egrep
二.  sed 

p是打印

-n 表示的是第几行

?+ ()要脱意 要不就加上-r选项

打印指定行 sed ‘10‘p -n 1.txt; sed ‘1,4‘p -n 1.txt; sed ‘5,$‘p -n 1.txt打印包含某个字符串的行 sed -n ‘/root/‘p 1.txt 可以使用 ^ . * $等特殊符号

-d表示删除 sed  ‘/root/‘d 1.txt

-e 可以实现同时进行多个任务 sed -e ‘/root/p‘ -e ‘/body/p‘ -n 1.txt 也可以用;实现  sed  ‘/root/p; /body/p‘ -n 1.txt删除行 sed ‘/root/d‘ 1.txt;   sed ‘1d‘ 1.txt; sed ‘1,10d‘ 1.txt替换 sed ‘1,2s/ot/to/g‘ 1.txt, 其中s就是替换的意思,g为全局替换,否则只替换第一次的,/也可以为 #, @ 等删除所有数字 sed ‘s/[0-9]//g‘ 1.txt删除所有非数字  sed ‘s/[^0-9]//g‘ 1.txt调换两个字符串位置 head -n2 1.txt |sed ‘s/\(root\)\(.*\)\(bash\)/\3\2\1/‘直接修改文件内容 sed -i ‘s/ot/to/g‘ 1.txtsed练习题:把/etc/passwd 复制到/root/test.txt,

用sed打印所有行

sed -n ‘1,$‘p test.txt
打印test.txt的3到10行

sed -n ‘3.10‘p test.txt

打印test.txt 中包含 ‘root‘ 的行

sed -n ‘/root/‘p test.txt

删除test.txt 的15行以及以后所有行

sed  ‘15,$‘d test.txt

删除test.txt中包含 ‘bash‘ 的行

sed ‘/bah/d‘ test.txt  

sed  s‘/root/toor/‘g test.txt

替换test.txt中 ‘/sbin/nologin‘ 为 ‘/bin/login‘

sed ‘s#/sbin/nologin#/bin/login/#g‘ test.txt

删除test.txt中5到10行中所有的数字

sed  ‘5,10 s/[0-9]//g‘ test.txt

删除test.txt 中所有特殊字符(除了数字以及大小写字母)

sed ‘1,$s/[^0-9a-Z]//g‘ test.txt

把test.txt中第一个单词和最后一个单词调换位置(这个地方要根据内容才能来写)

sed  ‘s#\([a-Z][a-Z]*\)\([^a-Z].*\)\([^a-Z]\)\([a-Z],$\)#\4\2\3\1#‘ test.txt

把test.txt中出现的第一个数字和最后一个单词替换位置

sed ‘s#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-Z]\)\([a-Z][a-Z]*\)#\1\5\3\4\2#‘ test.txt

把test.txt 中第一个数字移动到行末尾

sed ‘s#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\2\3\1#‘ test.txt

在test.txt 20行到末行最前面加 ‘aaa:‘

sed ‘s/aaa/‘ test.txt

sed ‘s/^.*$/&aaa/‘ test.txt

sed‘s/^.*s\/aaa:\1/g‘ test.txt

sed ‘s# (^.*.s)#aaa:\1#g‘ text.txt

三.  awk截取文档中的某段 awk -F ‘:‘ ‘{print $1}‘ 1.txt


-F 用于指定分隔符 

$1为第一个字段,$2为第二个字段,$0,它表示整行


也可以使用自定义字符连接每个段 awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ 1.txt


匹配字符或字符串 awk ‘/oo/‘ 1.txt针对某个段匹配 awk -F ‘:‘ ‘$1 ~/oo/‘ 1.txt(包含某段字符)多次匹配 awk -F ‘:‘ ‘/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/‘ 1.txt条件操作符==, >,<,!=,>=;<=  awk -F ‘:‘ ‘$3=="0"‘  1.txt; awk -F ‘:‘ ‘$3>="500"‘ 1.txt;   

 

 “”会当做字符串处理 ,用数字不加双引号

awk使用外部变量比较复杂

awk -F ’:‘ ‘$="‘$a‘"‘(单双单)1.txt


awk -F ’:‘ ‘$=‘$a‘‘(单单)1.txt


awk -F ‘:‘ ‘$7!="/sbin/nologin"‘  1.txt; awk -F ‘:‘ ‘$3<$4‘ 1.txt ; awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ 1.txt 

多次匹配也可以使用;

awk -F 
awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ 1.txtawk内置变量 NF(段数)  NR(行数)head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘ head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘ head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘ 打印20行以后的行awk ‘NR>20‘ 1.txtawk -F ‘:‘ ‘NR>20 && $1 ~ /ssh/‘  1.txt 更改某个段的值awk -F ‘:‘ ‘$1="root"‘ 1.txt数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘ 1.txt计算第三段的总和 awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ 1.txtawk中也可以使用if关键词 awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ 1.txtawk练习题用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)

awk ‘{ print $0}‘ test.txt

查找所有包含 ‘bash‘ 的行

awk ‘/bash/‘ test.txt

用 ‘:‘ 作为分隔符,查找第三段等于0的行

awk -F : ‘$3==0‘ test.txt

用 ‘:‘ 作为分隔符,查找第一段为 ‘root‘ 的行,并把该段的 ‘root‘ 换成 ‘toor‘ (可以连同sed一起使用)

awk -F : ‘$1=="root" test.txt | sed ‘s/root/toor/‘

用 ‘:‘ 作为分隔符,打印最后一段

awk -F ‘{ print  $NF }‘ 1.txt

打印行数大于20的所有行

awk -F : ‘NR >20‘ 1.txt

用 ‘:‘ 作为分隔符,打印所有第三段小于第四段的行

awk -F : ‘$3<$4‘ 1.txt

用 ‘:‘ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@‘ 连接 (例如,第一行应该是这样的形式 ‘root@/bin/bash‘ )

awk -F ‘:‘ ‘{ print $1@$NF}‘ 1.txt

awk -F  : ‘ {OFS= "@"; print$1,$NF}‘ 1.txt

用 ‘:‘ 作为分隔符,把整个文档的第四段相加,求和

awk -F: ‘{  ( sum=+$4) }; END {print sum }‘ 1.txt



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。