正则

正则是各种各样的特殊符号在一起形成的字符串

#Grep

eg. 首先在创建一个带有passwd文件的名叫grep的目录

grep

grep -c

grep-n

grep-i

grep-v

grep-r

grep -A2

##正则表达式

grep '[0-9]' 过滤出带数字的

grep -n '^#' inittab / grep -nv '^#' inittab 把以#开头的行以及非#开头的行列出来

grep -r 遍历所有子目录 eg. grep -r "nologin" /etc/ 在程序报错时可以过滤出nologin的行

grep '[^0-9]'

**!![^] 匹配非方括号里面的内容。就是:只要不是方括号里面的内容都打印出来。

 

^[^] 匹配非方括号里面的内容开头的所有字符。 只要不是方括号里面的内容所开头的,都打印出来。

grep 'r.o' passwd "."代表任意字符,可以匹配r开头o结尾的

grep 'o*o' *左边代表重复任意次数o,右边o 表示以o结尾(o+o的“+”也代表任意次数,但不包括0次)(o?t表示?前面任意次数的o,可以为0次)

grep ".*" 表示任意或者多个字符,空格也包括在内

grep 'o\{2\}' passwd 表示过滤出passwd中o出现两次,(数字可以表示次数或者范围 {2-3}也可)

如果觉得此中拖意符号繁琐,可以采用egrep & grep -E命令

egrep 'root|nologin' passwd/表示有root或者nologin均能匹配

常用命令 egrep -v "^#|^$" /etc/config | wc-l用来看修改后行数

 

#Sed

eg.实验操作 创建一个含有test.txt(passwd文件)的sed目录

sed跟grep比较,功能差不多,不带颜色显示,但是更强的功能在于替换

sed '/root/' test.txt(//内是需要匹配的字符)

sed '/root/'p test.txt (p是print出来)

sed -n '/root/'p test.txt表示仅仅匹配出相关行

sed -2 '2' test.txt(打印2到5行是用'2,5')

sed -n '25,$'p test.txt($表示末行,打印25到末行)

sed -e '1'p -e '/root/'p -n test.txt 多项匹配(-e)连续执行多条命令

sed如何不区分大小写打印 sed -n '/bus/'Ip test.txt

sed '1,25'd test.txt删除行 (实际上并没有删除文件,只是删除显示 sed -i '1,24'd test.txt为实际删除)

sed替换功能 sed '1,10s/root/toor/g‘ -n test.txt

*sed -r ’ro‘(ro是要加-r)

sed-r ’ro‘应用实例, 前后调换 /bin &root

head test.txt |sed -r 's/(.*)/aaa:&/' 将全部的开头文件替换成aaa(&代表前面的命令(.*))

在此命令基础上,我们可以进一步扩展,比如前一到五行行首加aaa(在s前设置范围1,5即可)

同样,如何在行尾加aaa?(&:aaa)

如何在本行的下一行添加,(第二行)sed ‘2a\XXX'

在某行前面添加行 sed '2i\xxx

'

[root@linux7-128 sed]# sed -n '/r*t/'p passwd

[root@linux7-128 sed]# sed -n '/r.t/'p passwd

[root@linux7-128 sed]# sed -n '/^t/'p passwd

+、?号需要使用脱义符

[root@linux7-128 sed]# sed -n '/r\+t/'p passwd

[root@linux7-128 sed]# sed -n '/r\?t/'p passwd

或者使用sed –nr

[root@linux7-128 sed]# sed -nr '/r+t/'p passwd

[root@linux7-128 sed]# sed -nr '/r?t/'p passwd

[root@linux7-128 sed]# sed -nr '/o{2}/'p passwd

[root@linux7-128 sed]# sed -nr '/root|huhu/'p passwd

#Awk工具

awk相较于gep/sed的好处在于在执行“+/?”等命令时不需要拖意

 

awk相比较于grep和sed多了一个功能,分段

eg. 实验环境,同理拷贝etc/passwd到awk的目录下,取名1.txt

awk -F ':' '{$1}' 1.txt 指定分隔符, 把第一段打印出来 ($0代表所有都打印)同理 也可以改成{$1,$2,$4}进行多段打印

如果上列没表明用:分隔,会默认的以特殊字符或者空格来分段

awk '/oo/' 1.txt 打印出oo行

awk -F ':' '$1 ~ /oo/' 1.txt 匹配出第一段中含有oo的

awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' 1.txt 多项匹配(awk同时支持多个表达式一起写)

awk -F ':' '$7!="/sbin/nologin"' 1.txt 列出所有第七段不等于/sbin/nologin(!=意为不等于)

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

同样也可以定义为更复杂的 awk -F ':' '$3>"5" && $3<"8"' 1.txt

awk -F ':' '{OFS='#'} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' 1.txt更换分隔符显示

awk -F ':' '{print NR":" $0} ' 1.txt会按行显示

awk -F ':' '{print NF":" $0} ' 1.txt会按段显示

awk -F ':' 'NR<=10 ' 1.txt 显示小于等于10行

#知识点扩展

#括号的区别

正则表达式的() [] {}有不同的意思。

() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。

(\s*)表示连续空格的字符串。

[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。

{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格。

(0-9) 匹配 '0-9′ 本身。 [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后面有 +,不可以为空){1-9} 写法错误。

[0-9]{0,9} 表示长度为 0 到 9 的数字字符串。

————————————————————————————————————————————————————————————

圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理 示例: 1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致 2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现 3、(?:abc)表示找到这样abc这样一组,但不记录,不保存到$变量中,否则可以通过$x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用$1获取(aaa)匹配到的内容,而$3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)匹配到的内容,因为前一对括号没有保存变量 4、a(?=bbb) 顺序环视 表示a后面必须紧跟3个连续的b 5、(?i:xxxx) 不区分大小写 (?s:.*) 跨行匹配.可以匹配回车符

方括号是单个匹配,字符集/排除字符集/命名字符集 示例: 1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符 2、[^0-3],表示找到这一个位置上的字符只能是除了0到3之外的所有字符 3、[:digit:] 0-9 [:alnum:] A-Za-z0-9

——————————————————————————————————————————————————————————————————————

()和[]有本质的区别

()内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多3次。如果没有括号的话,ab{1,3},就表示a,后面紧跟的b出现最少1次,最多3次。另外,括号在匹配模式中也很重要。这个就不延伸了,LZ有兴趣可以自己查查

[]表示匹配的字符在[]中,并且只能出现一次,并且特殊字符写在[]会被当成普通字符来匹配。例如[(a)],会匹配(、a、)、这三个字符。

所以() [] 无论是作用还是表示的含义,都有天壤之别,没什么联系

打印某行到某行之间的内容http://ask.apelearn.com/question/559(此命令用r无效)

-r, --regexp-extended

use extended regular expressions in the script.

-r只是支持扩展的正则表达式,对中括号脱意无效

sed -n '/\[abcfd\]/,/\[rty\]/p' test

sed转换大小写 http://ask.apelearn.com/question/7758

sed中,使用\u表示大写,\l 表示小写

 

1. 把每个单词的第一个小写字母变大写:

sed 's/\b[a-z]/\u&/g' filename

b表示单词的边界,&表示前面\\里的内容

2. 把所有小写变大写:

sed 's/[a-z]/\u&/g' filename

3. 大写变小写:

sed 's/[A-Z]/\l&/g' filename

sed在某一行最后添加一个数字http://ask.apelearn.com/question/288

sed 's/\(^a.*\)/\1 12/' 1.txt

删除某行到最后一行 http://ask.apelearn.com/question/213

打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048

sed -n '1,100{/abc/p}' 1.txt\

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值