正则表达式是一种文本模式,包括普通字符和特殊字符(元字符和修饰符)。使用字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式描述了一种字符串匹配的模式,可以用来检测一个字符串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构建正则表达式的方式和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所有搜索的字符串进行匹配。
Linux中常用的有两种正则表达式引擎:
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外。
格式:
/pattern/flags
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore-不区分大小写 | 将匹配设置为不区分大小写,搜索时 不区分大小写。 |
g | global-全局匹配 | 查找所有的匹配项。 |
m | multi line-多行匹配 | 使吧边界字符^和$匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点.中包含换行符\n | 默认情况下的圆点.是匹配除换行符\n之外的任何字符,加上s修饰符后,.中将会包含换行\n的。 |
所谓元字符,就是用于构建正则表达式的具有特殊含义的字符。例如:+*?
所谓限定符,就是限定一个原子必须出现多少次。
字符 | 描述 |
---|---|
+ | 匹配前面的子表达式一次或多次。 |
* | 匹配前面的子表达式零次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n是一个非负整数。匹配前面的子表达式确定的n次。 |
{n,} | n是一个非负整数。匹配前面的子表达式至少n次 |
{n,m} | n和m是一个非负整数。其中n<=m。最少匹配前面的子表达式n次且最多匹配m次。 注:在逗号和两个数之间不能由空格。 |
字符 | 描述 |
---|---|
^ | 匹配字符串的开始位置。 |
$ | 匹配字符串的结束位置。 |
\b | 匹配一个单词的边界,指的是单词和空格间的位置。 |
\B | 匹配非单词比边界。 |
例:
字符串:log var never verb
"er\b" 匹配的是never的er
"er\B"匹配的是verb的er
字符 | 描述 |
---|---|
\ | 转义字符,将下一个字符标记位一个特殊字符或取消特殊符号的含义。例如:n为普通字符加上\为\n表示换行,比如要输入字符\,则需要\\来表示一个\字符。 |
. | 匹配除了换行符(\n,\r)之外的任何单个字符。 |
[list] | 字符集合。匹配所包含的任意一个字符。 |
[^list] | 负字符集合。匹配任何不在范围内的任意字符。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。 |
\S | 匹配任何非空白字符,及\s的取非 |
\w | 匹配字母数字下划线 |
\W | 匹配非字母数字下划线,即\w的非取非 |
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先搞后低。
优先级从高到低如下表
运算符 | 描述 |
---|---|
\ | 转义符 |
(),[] | 圆括号和方括号 |
*,+,?,{n,m} | 限定符 |
^,$,\任何元字符、任何字符 | 位置和顺序 |
| | 替换,或操作 字符具有高于替换换算符的优先级,使得 |
grep 选项 查找条件 目标文件
egrep和grep选项相同:
-E:开启扩展的正则表达式
-c:计算过滤到的字符串的次数(如果匹配多个字符串在同一行只算一次)
-i:忽略大小写
-w:精确查找
-o:只显示被模式匹配到的字符串
-v:反向选择,即显示非匹配的字符串
--color=auto:可以降找到的关键词部分加上颜色的显示
-n:输出行号
正则表达式一起使用:
与正则限定符使用:
正则的多条件匹配:
也可以借助管道符实现多条件匹配:
与正则实现范围的匹配:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以分隔符截取,默认为制表符
-f:指定截取的行数,如:1截取第1列,1,3截取第1和第3列,1-3截取第1到3列
例题:
一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样。
语法:
sort 选项 参数
-t:指定分隔符,默认使用制表符或空格分隔
-k:指定排序区域,与-t一起使用,实现对不同关键字排序
-n:以数字进行排序,默认以文字大小排序
-u:等同于uniq,表示相同的数据仅显示一行,以换行符为终止,所以如果字符串后有空格也会一起比较
-r:默认升序排序,-r表示降序排序
-o:将排序后的结果转存只指定文本
主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重
uniq 选项 参数
-c:对重复的进行计数
-d:仅显示重复行
-u:仅显示出现一次的行
可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符
tr 选项 string1 string2
从标志输入中替换、缩减和/或删除字符,并将结果写道标志输出。
-d:删除字符
-s:删除所有重复出现的字符,只保留一个
实际应用:
1.统计当前连接主机数
ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c|
2.统计当前主机的连接状态
ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
sed是一个文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
sed 的工作流程主要包括读取、执行和显示三个过程。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed 选项 操作参数
sed 选项 -f scriptfile参数
常见的sed命令选项主要包含以下几种。
-e:表示用指定命令或者脚本来处理输入的文本文件。
-f:表示用指定的脚本文件来处理输入的文本文件。
-n、--quiet或silent:表示仅四按时处理后的结果。
-i:直接编辑文本文件
-r,-E:使用扩展正则表达式
-s将多个文件视为独立文件,而不是单个连续的长文件流
**操作:**用于指定对文件操作的动作行为,也就是 sed 的命令。
a:增加,在当前下面增加一行指定内容
c:替换,将选定行替换为指定内容
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果有非打印字符,则以ASCII码输出。其通常与-n选项一起使用。
s:替换,替换指定字符
y:字符转换。
sed输出行时可以与n和$等特殊意义字符一起使用
$:表示文件中末行
n:next,下一行
也可以与正则的编辑限定符一起使用
s:字符串替换
c:整行/整块替换
y:字符替换(以一个字符为单位替换)
格式 sed 'n,m(即行数,指定n-m行范围)s/要被替换的内容/替换的内容/选择范围(g全文,默认为1即替换每行第一个,2即替换每行第二个)'
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
i,I:忽略大小写
使用sed工具脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。
例如:sed '/yes/{H;d};$g' ifcfg-ens33
这是将文本中的带有yes的行移动到文末
可以编辑一个指令文本来实现,如
order.txt:
/yes/H
/yes/d
$g
当我们需要对一行数据进行多次操作的时候我们可以使用{}进行分组或-e分组执行。
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
数据可以来自标准输入也可以是管道或文件
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
命令格式:
awk 选项 ‘模式或条件{操作}’ 文件1 文件2
awk -f 脚本文件 文件1 文件2
awk 包含几个特殊的内建变量(可直接用)如下所示:
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
在使用Awk的过程中,可以使用关系运算符作为“条件”,用于比较数字与字符串,运算符有大于、小于、大于等于、小于等于、等于、不等于这些,也可以使用是逻辑操作符&&和||、!,还可以使用算术运算+、-、*、/、%、^、**等。当这些条件为真时,才执行指定动作。
[root@setting-style test]# awk -F: '/root/{print $0}' passwd
[root@setting-style test]# awk -F: 'NR==2' passwd
[root@setting-style test]# awk -F: '{print NF}' passwd
[root@setting-style test]# awk -F: 'NR==2||NR==5' passwd
[root@setting-style test]# awk -F: 'NR==2,NR==5' passwd
[root@setting-style test]# awk -F: '(NR>=2)&&(NR<=5)' passwd
awk -F: '{print $1}' passwd
awk -F: '$3>900' passwd
awk -F ":" '{print $1,$3}' passwd
awk -F ":" '$3<5{print $1,$3}' passwd
网卡的ip、流量
ifconfig ens33 | awk '/netmask/{print "p地址:"$2}'
ifconfig ens33 | awk '/RX p/{print $5" byte"}
其他内置变量的用法FS、OFS、NR、FNR、RS、ORS
NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始
FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
FS 输入字段分隔符,默认是空格
OFS 输出字段分隔符 默认也是空格
RS 输入行分隔符,默认为换行符
ORS 输出行分隔符,默认为换行符
逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅在读取完数据记录之后执行一次
awk 'BEGIN{FS=":";OFS="--"}{print $1,$2}' passwd
awk 'BEGIN{FS=":";OFS="--"}{print FNR,$1,$2}' passwd
END{ }语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"};END {print NR}'
Awk与变量,编程语句(if,for,while,函数和数组)一起使用
[root@setting-style test]# a=100
[root@setting-style test]# awk -v b="$a" 'BEGIN{print b}'
[root@setting-style test]# seq 6 | awk '{getline;print $0}'
awk -F: '{if($3<10){print $0}}' passwd
awk '{if($1<10){print $1}else{print $2}}' test.txt