正则表达式:Regular Expression REGEXP
由一类特殊字符及文本字符所编写的模式,表示控制或通配的功能
两类:
基本正则表达式BRE:
扩展正则表达式ERE:
*** grep GLoble search Regular exression and Print out the line
文本过滤(一定模式pattern)2
-v 反向匹配 显示未匹配到的行
-e 实现多个选项间的逻辑or关系
-o 仅显示匹配到的字符本身 而不是整行
-n 显示匹配的行号
-c 统计匹配的行数
-w 匹配单词
-E 支持扩展正则表达式 egrep
-i 忽略字符大小写
-q –quiet 静默模式,不输出任何信息 可用$?查看命令执行情况
-A# :after 显示匹配行及其前#行
B# :before 匹配行及其后#行
C# :context 匹配行及其前后#行
1.基本正则表达式元字符:
. 任意 单个字符
* 前面字符 任意次 可以不出现 0 – ∞
.* 任意长度 任意字符
\? 其前面字符 0次或一次 可有可无
\+ 其前面字符 1次或多次
\{m,n\} 其前面字符m至n次
\{m\} 指定出现m次 \{,n\} 至多n次
[] 指定范围内任意单个字符
[^] 指定范围外的任意单个字符
数字:[:digit:],小写字母[:lower:],大写字母[:upper:],字母[:alpha:],
字母数字[:alnum:],标点[:punct:],空格[:space:]
2.位置锚定:
^ 行首锚定,整个模式最左侧
$ 行尾锚定,整个模式最右侧
^pattern$ 用patt匹配整行
^$ 空白行 不可包含空格
^[[:space:]]*$ 空白行或包含任意空格的行
\<或\b 词首锚定
\>或\b 词尾锚定
\<pattern\>匹配完整单词
3.分组及引用:
\(\) 括号内的字符作为一组 \(xy\)\+ 一个或多个xy 括号可嵌套不可交叉
可用\1 \2 \3 …引用对应分组
*** 扩展正则表达式: 部分字符区别grep 不用加"\"
egrep => grep -E
1.扩展正则表达式的元字符:
.
[]
[^]
2.次数匹配: 不用加转义字符 "\"
*
?
+
{m}
{m,n}
3.位置锚定:
^
$
\<,\b
\>,\b
4.分组及引用:
()
后向引用:\1 \2 \3 …
5.或:
a|b a或者b ; z|Zjj z或Zjj ; (z|Z)jj zjj或Zjj
例 匹配1到255
egrep -o '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\>'
例 passwd 用户名与shell相同的行
egrep "^([^:]+\>).*\1$" /etc/passwd
例 简单 过滤出ip地址 不严谨
egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
===练习:grep
1.显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
#grep -i "^s" /proc/meminfo
#grep "^[sS]" /proc/meminfo
2.显示/etc/passwd文件中不以/bin/bash结尾的行
#grep -v "/bin/bash$" /etc/passwd
3.显示用户rpc默认的shell程序
#grep "^rpc\>" /etc/passwd|cut -d: -f7
4.找出/etc/passwd中的两位或三位数
#grep -o "[[:digit:]]\{2,3\}" /etc/passwd
5.显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
#grep "^[[:space:]]\+[^[:space:]].*" /etc/grub2.cfg
6.找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
#netstat -tan|grep "\<LISTEN[[:space:]]*$"
7.添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
#egrep "^([^:]+\>).*\1$" /etc/passwd
===练习:egrep
1.显示当前系统root、mage或wang用户的UID和默认shell
#egrep "^(root|mage|wang)" /etc/passwd|cut -d: -f3,7
2.找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
#grep "^[[:alnum:]_]*\>()" /etc/rc.d/init.d/functions
3.使用egrep取出/etc/rc.d/init.d/functions中其基名
#echo "/etc/rc.d/init.d/functions"|grep -o "[^/]*$"
4.使用egrep取出上面路径的目录名
#echo "/etc/rc.d/init.d/functions"|egrep -o "^.*/"
5.统计以root身份登录的每个远程主机IP地址的登录次数
#who|grep "root"|grep -o "(.*)"|uniq -c
不支持正则表达式元字符:
fgrep: fast grep
用不到元字符时 fgrep更快
===常用工具:
#cat [OPTION]… [FILE]…查看文件内容 tac:从行尾开始显示 rev:每行字符倒叙显示
-A:显示所有控制符
-n: 对每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
-E: 显示行结束符$
#more [OPTIONS…] FILE… 分页查看文件
-d: 显示翻页及退出提示
#less 分页查看文件 可回看
#head [OPTION]… [FILE]… 显示文件前几行 默认10行
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#:指定行数
#tail [OPTION]… [FILE]… 显示文件最后几行 默认10行
-#:
-f: 跟踪显示文件新追加的内容,常用日志监控
-c #: 指定获取后#字节
-n #: 指定获取后#行
tail -n0 -f FILE $
paste [OPTION]… [FILE]… 合并两个文件同行号的列到一行
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2
#wc word count 单词统计 常和管道|一起使用
-l 统计行数
-w 单词数
-c 字节数
-m 字符数
cut 从文件中的某些行剪切片段
-d 以指定的 字符作为 分隔符, 可以不加空格直接加字符 -d# 井号为分隔符
-f 显示出指定字段 -f3 #:单个字段 #-#:连续多个字段 #,#离散的多个字段
-c 按字符切割
–output-delimiter=STRING指定输出分隔符 默认":"
#sort 排序
-n 以数值 大小进行排序
-tCHAR 指定分隔符
-k# 设置比较字段 -t: -k3 冒号为分隔符 第3个字段
-r 逆序 排序
-f 忽略字符大小写
-u 重复的行保留一份 连续相同为重复
#uniq 报告或移除重复的行 配合sort 统计重复出现次数
-c 统计 每行重复次数
-u 只显示 无重复的行
-d 仅显示 有重复的行
#diff 逐行比较两个文件的不同 可制作补丁文件patch
diff file.old file.new
-u 输出“统一的(unified)”diff格式文件,适用于补丁文件
diff /oldpath /newpath>/patchfile 制作补丁 把diff命令结果重定向
$diff -u foo.conf-broken foo.conf-works>foo.patch
$patch -b foo.conf-broken foo.patch
patch 打补丁
-b选项来自动备份改变了的文件
patch[OPTIONS] -i (指定补丁文件) /patchfile /oldpath
patch /oldpath</patchfile
===练习:cut sort tr head tail uniq
1、找出ifconfig命令结果中本机的所有IPv4地址
#ifconfig|head -2|tail -1|cut -d: -f2|cut -d" " -f1
2、查出分区空间使用率的最大百分比值
#df|tr -s " " ":" |cut -d: -f5|sort -nr|head -1
3.查出用户UID最大值的用户名、UID及shell类型
#sort -nrt: -k3 /etc/passwd|head -1|cut -d: -f1,3,7
4.查出/tmp的权限,以数字方式显示
#stat /tmp|head -4|tail -1|cut -d "(" -f2|cut -d "/" -f1
5.统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
#netstat -nt|tr -s " " ":"|cut -d: -f6|uniq -c|sort -nr
原创文章,作者:Jasper,如若转载,请注明出处:http://www.178linux.com/29031