目录
这是我写完这所有的东西后开始写的下面这一段话,这篇文章是我耗时1天多时间写的,希望对你有所帮助。在写之前呢,我都在想,写完后会有人看嘛,是不是写完后浏览量特别低,浪费了自己的一片心血。如果我的这篇文章对您的技术有一点点增长,哪怕对您来说是九牛一毛上的毛尖尖,那对我来说都是心满意足了。
1.正则表达式
1.1正则表达式的概念
正则表达式是一种用于匹配和操作文本字符串的模式。它是由字符和特殊符号组成的字符串,用来描述一种字符匹配的模式。正则表达式常被用于文本搜索、替换、验证和提取等操作,具有强大的灵活性和通用性。
在正则表达式中,常用的特殊符号包括:
- 普通字符:代表自身的字符,例如字母、数字、标点符号等。
- 元字符:具有特殊含义的字符,如"."(匹配任意单个字符)、"*"(匹配前面的字符零次或多次)等。
- 字符类:用方括号表示,表示可以匹配其中任意一个字符,例如"[aeiou]"表示匹配任意一个元音字母。
- 量词:用于指定匹配次数,例如"*"(零次或多次)、"+"(一次或多次)、"?"(零次或一次)等。
- 边界匹配符:用于匹配字符串的边界,如"^"(匹配字符串的开头)、"$"(匹配字符串的结尾)等。
- 反向引用:用于在模式中引用已经匹配的子模式,例如"(pattern)\1"表示匹配两个连续相同的 pattern。
正则表达式在各种编程语言和文本处理工具中都有广泛的应用,是处理文本数据的重要工具之一。
1.2正则表达式元字符
1.2.1常用元字符
字符 | 说明 |
. | 匹配除换行符(\n、\r)以外的字符 |
^ | 匹配行首。例如:^linux 匹配以行首为linux开头的行 |
$ | 匹配行尾。例如:linux$ 匹配以行尾为linux结尾的行 |
^$ | 匹配空行 |
* | 匹配所有。用于指前面的元素或子模型出现0次或多次 |
.* | 匹配任意长度字符串 |
\ | 转义符,用于取消特殊符号的含义。使得该字符为普通符号,'\\' 匹配 "\" 而 "\(" 则匹配 "(" |
[ ] | 匹配中括号中一个任意字符,例如[0-9]表示匹配0到9的一个数字 |
[^] | 匹配除了括号中的字符,例如[^c^x^q]表示匹配除了c、x、q以外的任意字符 |
{n} | {n}是一个量词元字符,它表示前面的元素或子模式必须恰好出现 n 次。这里的n是一个整数。例如"a{3}"代表匹配3个连续的a,例如:aaa "\d{4}"代表会匹配一个四位数字,如"1234" |
{n,} | {n,} 是一个量词元字符,它表示前面的元素或子模式必须出现至少 n 次,但可以出现更多次。 这里的 n 是一个正整数。例如 a{2,} 会匹配至少连续两个 a 字符的字符串,如 "aa"、"aaa"、"aaaa" 等。 |
{n,m} | n和m为非负整数,并且n<=m,最少匹配n次,最多匹配m次。例如:"o{1,3}",代表匹配前3个o1.2 |
1.2.2带反斜杠的常用元字符
\d | 表示匹配一个数字。相当于[0-9] |
\D | 表示匹配一个非数字的字符。相当于[^0-9] |
\w | 匹配字母数字下划线。相当于[a-zA-Zo-9] |
\W | 匹配非字母数字下划线字符。相当于[^a-zA-Zo-9] |
\b | 匹配一个单子的边界。"er\b"可以匹配worker,但是不能匹配verb |
\B | 匹配一个单子的非边界。"er\B"可以匹配v |
\S | 匹配不是空白符的字符 |
1.2.3扩展元字符
+ | 匹配前面一个字符或子表达式一次或任意多次,例如"zo+",能匹配"zo"和"zoo",但是不能匹配"zoo",相当于{1,} #这里注重的是重复 |
? | 匹配前面的一个字符或子表达式零次或一次,相当于{0,1} #同上,注重的是重复 |
| | 表示或,is|are 表示匹配 "is" 的行或者 "are" 的行 |
() | 标记一个表达式的开始或者结束位置,将括号中的视为一个整体 "(dog)+" 会匹配dog dogdog |
1.2.4详解和示例:
(1)\d*表示匹配0次或多次数字,例如可能为空或者任意数字
(2)\d+ | \d{1,} 表示重复一次或多次匹配意数字
(3)\d? | \d{0,1} 表示重复匹配0次或者1次数字
(4)^[a-z]+$ 表示只匹配小写字母组成的字符串
(5)^\w+$ 表示只匹配字母数字或者下划线的字符串
在开发中一般常用这些正则,例如“^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$”这是一个验证是电话号码的正则表达式
1.2.5非打印字符
\n | 匹配一个换行符,相当于是\x0a或\cj |
\f | 匹配一个换页符,相当于是\0x或\cL |
\r | 匹配一个回车符。等价于 \x0d 和 \cM |
\t | 匹配一个制表符。等价于 \x09 和 \cI |
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\e | Escape |
\G | 当前搜索的开头 |
(?>aux) | 贪婪子表达式 |
(?<x>-<y>aux) | 平衡组 |
1.2.6修饰符
IgnoreCase(忽略大小写) i | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别 |
Multiline(多行模式) m | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾 |
Singleline(单行模式) s | 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
IgnorePatternWhitespace(忽略空白) g | 查找所有的匹配项 |
1.2.7运算优先级
优先级遵循从上到下的优先级顺序来决定先看哪个运算符号
\ | 转义符 |
(), (?:), (?=), [] | 圆括号或者方括号 |
*, +, ?, {n}, {n,}, {n,m | 限定符 |
^, $, \任何元字符、任何字符 | 位置和顺序 |
| | "或"操作 |
1.2.8常用惰性限定符
*? | 重复任意次,但是尽可能少重复 |
+? | 重复1次或更多次,但是尽可能少重复 |
?? | 重复0次或1次,但是尽可能少重复 |
{n,m}? | 重复n到m次,但是尽可能少重复 |
{n,}? | 重复n次以上,但是尽可能少重复 |
2.shell三剑客
2.1shell三剑客之grep
grep 是一个在 Unix/Linux 系统中非常常用的命令行工具,用于在文本文件中搜索指定模式的行,并将匹配到的行输出到标准输出。下面跟我一起进行操作,在学习三剑客的时候顺便复习一下刚才上面的正则的知识
2.1.1 grep的常用参数
-i 忽略大小写
-v : 反转搜索,只匹配不带关键词的行
-r或-R: 递归搜索目录和目录中的文件
-l: 只列出包含匹配模式的文件名,不显示具体的匹配行。
-L: 只列出来不包含匹配的文件名
-n: 显示匹配的行和行号
-c: 只显示匹配行的技术
-o: 输出匹配行的部分,而不是显示整行
-e: 指定多个模式
-m: 匹配num个停止匹配
-P: 使用 Perl 兼容的正则表达式(PCRE)
-F: 将模式视为固定字符串,而不是正则表达式
-E: 使用扩展的正则表达式
#使用基本正则表达式(ERE),这是
grep
默认的行为。ERE 使用的是基本的元字符,例如
+, ?, |
等,不支持 Perl 兼容的元字符。适合在正则表达式中使用常见的元字符,如
+
,?
,|
等。
Perl 正则表达式是一种在 Perl 编程语言中广泛使用的强大工具,用于处理文本和字符串数据。正则表达式是一种模式匹配的机制,允许您在文本中搜索、替换和提取特定模式的字符串。
Perl 正则表达式的语法相对灵活且强大,允许您以各种方式指定模式,包括匹配特定字符、字符类、重复次数、位置、分组等等。以下是一些 Perl 正则表达式中常用的元字符和语法:
-
字符匹配:
.
: 匹配除换行符以外的任意字符。\w
: 匹配任意字母、数字或下划线字符。\d
: 匹配任意数字字符。\s
: 匹配任意空白字符。
-
字符类:
[...]
: 匹配括号中列举的任意一个字符。例如,[aeiou]
匹配任意一个元音字母。[^...]
: 匹配除括号中列举的字符之外的任意字符。例如,[^0-9]
匹配任意一个非数字字符。
-
重复次数:
*
: 匹配前面的元素零次或多次。+
: 匹配前面的元素一次或多次。?
: 匹配前面的元素零次或一次。{n}
: 匹配前面的元素恰好 n 次。{n,}
: 匹配前面的元素至少 n 次。{n,m}
: 匹配前面的元素至少 n 次,但不超过 m 次。
-
位置:
^
: 匹配字符串的开头。$
: 匹配字符串的结尾。\b
: 匹配单词边界。
-
分组和捕获:
(...)
: 表示一个分组,可以对匹配的内容进行捕获和后向引用。
在 Perl 中,您可以使用正则表达式来执行各种操作,如搜索、替换、提取等。Perl 的正则表达式功能非常强大,但也需要一定的学习成本来熟悉其语法和使用方法。
2.1.2grep和正则的示例演示
2.1.2.1编写测试文件
[root@test ~]#vim test.txt
aaaaaaaaaaaaaaaaa
AAAAAAAAAAAAAAAAAAAA
aaaAAAAAA
bbbbbBBBBBBBBBB
123AAAaaaBBBBBB
123456#I LOVE YOU
a
a
BB
BBBBBBB
2.1.2.2示例和详解1
[root@test ~]#grep -nEv "^#|^$" test.txt
1:aaaaaaaaaaaaaaaaa
2:AAAAAAAAAAAAAAAAAAAA
3:aaaAAAAAA
6:bbbbbBBBBBBBBBB
7:123AAAaaaBBBBBB
8:123456
11:a
12:a
13:BB
14:BBBBBBB
2.1.2.3示例和详解2
[root@test ~]#grep -nP "^\d{1,}" test.txt
7:123AAAaaaBBBBBB
8:123456
2.2shell三剑客之sed
2.2.1sed的常用参数
sed 是一个流编辑器,用于对输入流(或文件)进行基本的文本转换。以下是一些 sed 命令的常用参数
-e script 或 --expression=script
添加一个或多个编辑命令到脚本中。可以使用多个 -e 参数来指定多个编辑指令。
-f script-file 或 --file=script-file
添加一个或多个编辑命令到脚本文件中,然后执行这些脚本文件。
-n, --quiet, --silent
只输出经过编辑的行,不输出未经编辑的行。
-i[SUFFIX], --in-place[=SUFFIX]
直接修改文件内容,而不是将结果输出到标准输出。如果指定了 SUFFIX,则会创建一个备份文件,其文件名会在原始文件名后附加该后缀。要慎用
-r 或 --regexp-extended
使用扩展正则表达式进行匹配。
-s, --separate
将输入文件视为多个独立的数据流进行处理。这意味着,当处理多个文件时,每个文件都会被视为一个独立的输入流。
-u, --unbuffered
即时输出,不缓冲。这可以确保在处理大量数据时,输出会尽快地显示在屏幕上。
-z, --null-data
将输入文件视为以 null 字符分隔的数据流进行处理。这通常用于处理包含 null 字符的文件。
-y, --squelch-input, --silent
禁止自动打印模式空间的内容。这通常与 -n 参数一起使用,以确保只输出经过编辑的行。
-l N, --line-length=N
指定行的最大长度。当 sed 处理多行模式时,这可以限制模式的最大长度。
-b, --binary
以二进制模式打开文件。这通常用于处理包含特殊字符或二进制数据的文件。
动作指令:
p 打印 ,输出指定的行
S 替换,替换指定字符串
d 删除,删除行
a 增加行,在当前行下面插入文件
i 增加行,在当前行上面插入文件
c 把选定的行改为新的指定的文本
r 读取文件,即用于将一个独立文件的数据插入到当前数据流的指定位置
w 另存为
#以上只是 sed 命令的一些常用参数,实际上 sed 还有很多其他选项和功能。为了更深入地了解 sed,建议查阅其官方文档或相关教程。
2.2.2sed和正则的示例演示
2.2.2.1编写测试文件
[root@test ~]#vim test2.txt
my cat's name is betty
my cat's name is betty
This is your dog
my dog's name is frank
This is your fish
my fish's name is george
This is your goat
my goat's name is adam
2.1.2.2示例和详解1
[root@test ~]#sed '/cat/p' test2.txt
my cat's name is betty
my cat's name is betty
This is your dog
my dog's name is frank
This is your fish
my fish's name is george
This is your goat
my goat's name is adam
p指令是默认输出所有行,"-n"选项,禁止默认输出 '/cat/p':当行匹配“cat”时,打印该行
2.2.2.3示例和详解2
[root@test ~]#sed -n '/cat/p' test2.txt
my cat's name is betty
sed -n '/cat/p' test2.txt 中的 -n 选项是用来抑制 sed 的默认输出行为,即不输出处理过的每一行。p 命令则用于打印匹配指定模式的行。
这个命令组合的结果是:只有包含“cat”的行会被打印出来,并且每个包含“cat”的行只会被打印一次,不论它在文件中出现了多少次。
2.2.2.4示例和详解3
[root@test ~]#cat -n test2.txt | sed -n -e '2p' -e '4,6p'
2 This is your dog
4 This is your fish
5 my fish's name is george
6 This is your goat
一次打印多个行,第一个-n是输出时显示行号,第二个-n是抑制输出的意思,下个示例会说加-n和不加-n的区别
2.2.2.5示例和详解4
[root@test ~]#cat -n test2.txt | sed -e '2p' -e '4,6p'
1 my cat's name is betty
2 This is your dog
2 This is your dog
3 my dog's name is frank
4 This is your fish
4 This is your fish
5 my fish's name is george
5 my fish's name is george
6 This is your goat
6 This is your goat
7 my goat's name is adam
注意,如果不加-n他会重复2行和4行
2.2.2.5示例和详解4
[root@test ~]#sed -i 's/^/#/g' test2.txt;cat test2.txt
#my cat's name is betty
#This is your dog
#my dog's name is frank
#This is your fish
#my fish's name is george
#This is your goat
#my goat's name is adam
注释文件的所有行
[root@test ~]#sed -i 1,3's/^#//g' test2.txt;cat test2.txt
my cat's name is betty
This is your dog
my dog's name is frank
#This is your fish
#my fish's name is george
#This is your goat
#my goat's name is adam
将1到3行取消注释
2.2.2.6示例和详解5
[root@test ~]#sed -i '/cat/d' test2.txt;cat test2.txt
This is your dog
my dog's name is frank
#This is your fish
#my fish's name is george
#This is your goat
#my goat's name is adam
删除匹配cat的行
[root@test ~]#sed -i '1i \hello world' test2.txt;cat test2.txt
hello world
This is your dog
my dog's name is frank
#This is your fish
#my fish's name is george
#This is your goat
#my goat's name is adam
在第一行插入hello world
[root@test ~]#sed -i '/^#/c \#####################' test2.txt;cat test2.txt
hello world
This is your dog
my dog's name is frank
#####################
#####################
#####################
#####################
将开头为#的行改为#####################的行
2.3shell三剑客之awk
2.3.1awk的介绍
awk 是一种强大的文本处理工具,通常用于对文本文件进行逐行处理和分析。它可以根据用户定义的规则来分割每一行,并对每个字段进行操作和处理。 其实awk我本人就看作是一种编程类语言,他的用法我个人感觉和C++的命令差不多,如果学过C++的可以很快的学习awk。
以下是 awk 的一些基本特性和用途:
文本处理:awk 可以按行处理文本文件,并根据指定的分隔符将每行分割成多个字段。
模式匹配:awk 允许您使用模式来匹配文本,并对匹配到的行进行处理。这些模式可以是正则表达式,也可以是简单的字符串匹配。
字段操作:awk 允许您对每个字段进行各种操作,如打印、替换、计算等。您可以通过 $1、$2 等来引用每个字段,也可以使用内置函数对字段进行处理。
内置函数:awk 内置了许多函数,用于对字段进行操作,如字符串函数、数学函数等。这些函数可以帮助您执行各种复杂的文本处理任务。
条件处理:awk 支持条件语句,允许您根据条件对文本进行不同的处理。这使得 awk 在处理数据时更加灵活和强大。
输出格式控制:awk 允许您控制输出的格式,包括字段之间的分隔符、输出的宽度等。这使得您可以轻松地生成格式化的报告或数据文件。
脚本功能:除了在命令行中使用外,awk 还支持编写脚本文件,其中可以包含更复杂的处理逻辑和算法。
总的来说,awk 是一个非常强大的文本处理工具,适用于各种需要对文本进行处理和分析的场景,如日志分析、数据清洗、报表生成等。
2.3.2匹配规则,一般使用关系表达式作为条件
awk保留字 | BEGIN | BEGIN 是一个特殊的模式(pattern),它用于在处理输入文本之前执行一次性的初始化操作。BEGIN 块是可选的,它通常用于设置变量、打印表头或执行其他预处理任务。 |
awk保留字 | END | END 是另一个特殊的模式(pattern),它用于在处理完整个输入文本之后执行一次性的操作。与 BEGIN 相反,END 用于在处理输入结束后进行总结、汇总或其他收尾工作。 |
关系运算符 | > | 大于 |
< | 小于 | |
== | 等于 | |
>= | 大于等于 | |
<= | 小于等于 | |
!= | 不等于 | |
匹配表达式 | ~ | 匹配 |
!~ | 不匹配 | |
正则表达式 | /填写正则或字符/ | //中填写正则或者字符 |
逻辑运算符 | && | 逻辑与 |
|| | 逻辑或 |
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量。
$0 | 代表整个文本行 |
$1 | 代表文本行中的第 1 个数据字段 |
$2 | 代表文本行中的第 2 个数据字段 |
$n | 代表文本行中的第 n 个数据字段 |
2.3.3awk和正则的示例演示
2.3.3.1示例和详解1
截取主机ip
[root@test ~]#ifconfig ens33 | awk '/netmask/{print $2}'
192.168.1.132
ifcongig可以截出来网卡为ens33的信息,然后匹配关键字为netmask的行,最后输出第二个字段,这里没显示用的分隔符是什么,默认的分隔符为空格,如需加分隔符需要用-F的参数
2.3.3.2示例和详解2
[root@test ~]awk -F ":" '$7 ~ /nologin$/{print $1"==>"$7}' /etc/passwd
daemon==>/usr/sbin/nologin
bin==>/usr/sbin/nologin
sys==>/usr/sbin/nologin
games==>/usr/sbin/nologin
man==>/usr/sbin/nologin
lp==>/usr/sbin/nologin
mail==>/usr/sbin/nologin
news==>/usr/sbin/nologin
uucp==>/usr/sbin/nologin
proxy==>/usr/sbin/nologin
www-data==>/usr/sbin/nologin
backup==>/usr/sbin/nologin
指定分隔符为:匹配第7个字段关键词为nologin的行,最后输出第1列和第7列并且第1列和第7列的分隔符为==>,处理的文件为/etc/passwd
2.3.3.3示例和详解3
[root@test ~]awk -F ":" 'BEGIN{print"user\t\tbash"}$3>1000{print $1"\t\t"$7}END{print "+++++++++++++\n I LOVE YOU \n+++++++++++++"}' /etc/passwd
user bash
nobody /usr/sbin/nologin
+++++++++++++
I LOVE YOU
+++++++++++++
这awk的意思是分隔符为“:”,第一个{}中代表先输出user 然后输出两个制表符,最后输出bash,由于/etc/passwd的第三列字段代表uid,所以匹配uid>1000的用户。第二个{}代表匹配成功后输出第一列字段,然后输出两个制表符,最后输出第七列字段。最后END后面代表输出+++++++++然后执行一个换行,然后再输出一个I LOVE YOU,最后再执行个换行,输出+++++++++。处理的文件为/etc/passwd
2.3.3.4示例和详解4
[root@test ~]awk -F ":" -v var='统计用户数' -v count=0 'BEGIN{print var}{count++}END{print "user count is:",count}' /etc/passwd
统计用户数
user count is: 31
前面分隔符就不说了,后面-v是做统计的,首先我先给var和count赋一个值。第一个{}为输出 var的变量,然后这个count++是输出文件有多少行,/etc/passwd每一行为一个用户。count++再说一下这个,这个是先用后加,什么意思呢?我拿数值举例,假如说我的i=1,然后我执行a=i+i++最后输出a的值为2。如果要是执行a=i+(++i),最后输出a的值为3
2.3.3.4示例和详解4
[root@test ~]awk -F ":" 'END {print $NF}' /etc/passwd
/usr/sbin/nologin
这是输出/etc/passwd文件下的最后一行的最后一列
或者
[root@test ~]tail -n 1 /etc/passwd | awk -F: '{print $NF}'
/usr/sbin/nologin
兄弟,如果你仔细的从上向下看到这里,就证明你一定是一个耐心自律很强的人!
加油!一定会成为更好的自己!