一、正则表达式
1.1 正则表达式定义
正则表达式(Regular Expression)是一种用来匹配和操作文本的模式。它是由字符和特殊字符组成的字符串,用来描述和匹配一系列符合某种模式的字符串。与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式主要用来匹配字符串(命令结果,文本内容),
通配符匹配文件(已存在的文件)
1.2 元字符
. #单个任意字符
[ ] #单个字符 [abc] a或b或c
#正则表达式大小写敏感
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[^abc] #取反abc
[a.c]#表示a.c 转义用法[a\.c]
任何元字符在[]中表示原意
1.3 元字标点
[root@localhost sh] ls /etc/|grep 'rc.'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@localhost sh] ls /etc/|grep 'rc\.' #点值表示点需要转义
rc.d
rc.local
[root@localhost sh]
1.4 表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符,不包括0次
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
实例:提取ip地址
ifconfig ens33|grep netmask|grep -o '[0-9]\+.[0-9]\+.[0-9]\+.[0-9]\+'
ifconfig ens33|grep netmask|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|head -n1
1.5 位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行 只有root)
^$ #空行
^[[:space:]]*$ # 空白行
\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
1.5 分组或其他
分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或使用 \|
[root@localhost ~]echo abcabcabc |grep "\(abc\)\{3\}"
#分组 匹配abc
echo 1abc |grep "1\|2abc"
#只匹配了1
echo 1abc |grep "\(1\|2\)abc"
#1abc或者2abc
1.6 扩展正则表达式
表示次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
二、grep
2.1 通式
grep [选项]… 查找条件 目标文件
选项:
-i, --ignore-case:忽略大小写进行匹配。
-v, --invert-match:反转匹配,只显示不匹配的行。
-n, --line-number:显示匹配的行号。
-l, --files-with-matches:仅显示包含匹配的文件名,而不显示匹配的行。
-c, --count:显示匹配的行数而不显示匹配的行,仅计数。
-r, --recursive:递归地在目录中搜索文件。
-w, --word-regexp:仅匹配整个单词而不是部分匹配。
-A NUM, --after-context=NUM:显示匹配行后的指定行数上下文。
-B NUM, --before-context=NUM:显示匹配行前的指定行数上下文。
-E, --extended-regexp:使用扩展的正则表达式语法。
-F, --fixed-strings:将模式视为固定字符串,而不是正则表达式
实例:
统计当前主机的连接状态、当前连接主机数
[root@localhost sh] ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
1 ESTAB
11 LISTEN
[root@localhost sh] ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c
1 192.168.50.100
1 Address
三、AWK (一种程序语言)文本处理工具
1.1 vim和awk区别
-
vim是把整个文件全部加载到内存中,如果内存不够,则无法处理文件
-
awk 加载一行到内存,处理一行
1.2 awk用法
awk [选项] '表达式{处理动作}'
#表达式:awk的语言表达式,1不写没有
#处理动作:print打印;printf 升级的打印
-F #指定分隔符
-v #指定变量
1.3 awk基本变量
$0 #全文
$1 #第一列
$2 #第二列
awk的内置变量和shell环境中的变量会有冲突,所以使用'{}'
BEGIN{'print "hi"'} #BEGIN 处理的开头
END{print "hi"} #END 处理的结尾
df|awk '{print $5}' 取第五列,默认是空格
awk '{print $n}' #已空格为分隔符,取$列
NF 字段的个数 倒数第一列 $NF 倒数第二列 $(NF-1)
NR 显示行号 NR==2 只显示第二行 奇数行 偶数行 $n>1000
1.4 awk数组
[root@localhost opt] awk 'BEGIN{a[1]="lisi";a[2]="liwu";a[3]="maliu";print a[3]":"a[2]":"a[1]}'
maliu:liwu:lisi
也可以加for循环处理
[root@localhost opt] awk 'BEGIN{a[1]="lisi";a[2]="liwu";a[3]="maliu";for (i in a) print a[i]}'
lisi
liwu
maliu