正则是各种各样的特殊符号在一起形成的字符串
#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