正则是各种各样的特殊符号在一起形成的字符串
#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行
扩展知识点:
1. Sed 的补充用法
打印文件中特定的某行到某行之间的内容
例如:有个文件test的内容如下:
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
怎么能截取
[abcfd]
123
324
444
[rty]
这一部分出来呢?
答案: sed -n '/\[abcfd\]/,/\[rty\]/p' test
sed 如何转换大小写字母
& 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
\b为begin 意指一个单词的边缘,放在前面为第一个字母,放在后面为最后一个字母
& . 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
& . 大写变小写:
sed 's/[A-Z]/\l&/g' filename
sed在某一行最后添加一个数字
(在以a开头后面加数字)
sed 's/\(^a.*\)/\1 12/' test
sed -r 's/(^a.*)/& 12/' test
在每一行的行首行尾加参数
sed 's/^/#/g' filename
$ sed 's/$/ --- /g'
替换第3行,3-6行
sed "3s/my/your/g"
sed "3,6s/my/your/g" filename
只替换每一行的第一个s:
sed 's/s/S/1' (不加g全局替换就是替换第一个)
只替换每一行的第二个s:
sed 's/s/S/2'
只替换第一行的第3个以后的s
sed 's/s/S/3g'
Sed N (eg sed 'N;s/my/your/')
以为匹配出所需行以及下一行,并换成一行
A追加与I插入的用法
在第一行前追加
sed "1 i XXX“ filename
sed "$ a XXX" filename
对每一行都挺插入
sed "/my/a ----" filename
https://blog.csdn.net/offbye/article/details/48498545
2. AWK 的拓展用法
在awk中使用外部shell的变量, 要用-v进行变量转换
http://ask.apelearn.com/question/199
awk 合并一个文件 http://ask.apelearn.com/question/493
awk '{print NR,FNR}' 1.txt 2.txt //首先理解NR和FNR的不同
当NR==FNR其实就是第一个文件的内容
当NR>FNR,其实就是第二个文件的内容
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
方法一:
a=`cat file`;echo $a
方法二:
awk '{printf("%s ",$0)}' file
方法三:
cat file |xargs(下图应用实例先把多行打成一行然后更改空格为+号,最后bc命令统加)
过滤两个或多个关键词 http://ask.apelearn.com/question/198
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式 (只有awk是不区分正则和扩展正则的)
awk用print打印单引号 http://ask.apelearn.com/question/1738
awk 'BEGIN{print "a'"'"'s"}'
awk 'BEGIN{print "a'\''s"}'
awk 'BEGIN{print "a\"s"}'