一、正则表达式
什么是正则?正则就是一串由规律的字符串,在shell中用处很大,常用的指令有grep/egrep,sed,awk。
grep更适合单纯的查找或者匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行复杂格式处理。
1
grep通常配合管道符一起使用:grep -参数 ‘word’ filename | |
-c | 统计行数 |
-i | 不区分大小写 |
-n | 显示行号 |
-v | 取反 |
-r | 遍历所有子目录 |
-A | 加数字过滤出符合要求的行以及下面n行 |
-B | 同上,过滤出符合条件的行以及上面n行 |
-C | 同上,过滤出符合条件的行以及上下n行 |
-E | 显示符合多个条件的记录 |
2、
engrep进阶版 | |
grep ‘[0-9]’ passwd | 显示包含数字的行 |
grep -v ‘[0-9]’ passwd | 显示不包含数字的行 |
grep -v ‘^#’ passwd | 显示不以#开头的行 |
grep -v ‘^#’ passwd|grep -v ‘^@’ | 显示既不以#也不以@开头的行 |
grep ‘^[^a-zA-Z]’ passwd | 显示不包含字母并且不是以字母开头的行,第一个^表示以什么开头,第二个^表示取反 |
grep ‘r.o’ passwd | 查询r o中间包含一个字符的行 |
grep ‘o*’ passwd | 查询含有任意个o的行 |
grep ‘o\{2\}’ passwd/grep -E ‘o{2}‘ | 查询含有两个连续o的行 |
egrep ‘o{2}’ passwd | 查询含有两个连续o的行 |
egrep ‘o+’ passwd | 查询含有o的行 |
egrep ‘oo?’ passwd | 查询含有o的行 |
egrep ‘root|nologin’ passwd | 查询含有root或者nologin的行 |
egrep ‘(oo){2}’ passwd | 重复出现两次oo组合的字符串 |
grep ‘o\{2\}’ passwd 中\为转义符,因为{}是特殊字符所以要转义
也可以使用grep -E ‘o{2}’ passwd来显示
如果不加转义符,结果显示为
3、
sed是一种流编辑器,可以实现行的输出替换删除等操作 | |
n | 只打印模式匹配的行 |
e | 可以同时打印多行,为默认选项 |
f | 将sed操作写在另一个文件内 |
i | 直接修改文件内容 |
n\? | 匹配n零或一次 |
\{m,n\} | 匹配前面字符至少m此至多n次 |
\{m\} | 精确匹配前面字符m次 |
[ ] | 匹配[ ]内任意单个字符 |
[^] | 匹配除[ ]内任意单个字符 |
r | 可以省去很多转义操作 |
sed -n ‘5’p passwd | 打印出第五行 |
sed -n ‘1,5’p passwd | 打印1-5行 |
sed -n ‘1,$’p passwd | 打印所有 |
sed -n ‘/root/’p passwd | 打印包含root的行 |
sed -n ‘/^1/’p passwd | 打印以1开头的行 |
sed -n ‘/r..o/’p passwd | 打印r和o中间有两个字符的行 |
sed -n ‘/oo*/’p passwd | 打印含有o的行 |
sed -e ‘1’p -e ‘/111/’p -n passwd | 打印第一行和包含111的行 |
sed ‘1’d passwd | 打印不显示第一行 |
sed ‘/oot/’d passwd | 打印不包含oot的行 |
sed ‘1,2s/ot/to/g’p passwd | 将1-2行所有ot替换为to |
sed ‘s#ot#to#g’ passwd | 将所有的ot替换为to |
sed ‘s/[0-9]/%/g’ passwd | 将所有数字替换成% |
sed ‘s/[a-zA-Z]/%/g’ passwd | 将所有字母替换成% |
sed -r ‘s/(root)(.*)(nologin)/\3\2\1/’ passwd | 见下图*1 |
sed ‘s/^.*$/123&/’ passwd | 将123添加到每行行首 |
sed -i ‘s/ot/to/g’ passwd | 将所有ot替换为to |
*1
4、
awk是一种文本处理语言 | |
-F | 指定输入文件分隔符 |
-v | 赋予一个用户定义的变量 |
~ | 匹配,与==相比不是精确比较 |
ARGC | 命令行变元个数 |
ARGV | 命令行变元数组 |
FILENAME | 当前输入文件名 |
FNR | 与NR类似,每个文件从1开始 |
FS | 输入域分隔符,默认为一个空格 |
RS | 输入记录分隔符 |
NF | 有几个域即分隔符分开几个字段 |
$NF | 最后一个列 |
OFS | 输出分割符 |
ORS | 输出记录分隔符 |
head -n2 passwd|awk -F ‘:’ '{print $1}’ | 显示文本前两行的第一列 |
head -n2 passwd|awk -F ‘:’ {print $0}’ | 显示前两行 |
awk -F ‘:’ ‘{print $1”#”$2”#”$3” #”$4}’ | 显示前四列并以#分隔开 |
awk ‘/oo/’ passwd | 显示带有oo的行 |
awk -F ‘:’ ‘$1 ~/oo/’ passwd | 显示第一列带有oo的行 |
awk -F ‘:’ ‘$3==”0”’ passwd | |
awk -F ‘:’ ‘$3>=500’ passwd | 显示第三列大于500的行 |
awk -F ‘:’ ‘$7!=/sbin/nologin’ passwd | 显示第七列不是该目录的行 |
awk -F ‘:’ ‘$3<$4’ passwd | 显示第三列小于第四列的行 |
head -5 passwd |awk -F ‘:’ ‘{OFS =”#”} {print $1,$3,$4}’ | OFS为输出分隔符,显示前五行,1,3,4列并以#隔开 |
head -n3 passwd |awk -F ‘:’ ‘{pri nt NF}’ | 输出当前记录域的个数 |
head -n3 passwd |awk -F ‘:’ ‘{print NR}’ | 输出读取前三行的行数 |
awk ‘NR>3’ passwd | 显示读取数据行数大于三的行 |
awk -F ‘:’ ‘NR<20&&$1 ~/roo/’ | 表示前二十行并第一列带有roo行 |
awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ passwd | 统计第三列文件长度相加值 |
awk -F ‘:’ ‘{if($1==”root”)print $0}’ passwd | 如果第一列值为root,则输出整行 |
5、正则中需要转义的字符
$,(),*,+,{},[],^,.,|
正则三侠具体怎么发挥作用还需要大量的手动练习,如果本文有什么错误欢迎指出,一起讨论~