正则表达式 文本三剑客

一 正则表达式:

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。

正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等

一 元字符点(.)

① [root@localhost ~]#ls /etc/|grep rc[.0-6]

② [root@localhost ~]#ls /etc/ | grep 'rc\.'

③ [root@localhost ~]# grep r..t /etc/passwd

④ [root@localhost ~]# echo abc |grep a.c

⑤ [root@localhost ~]# echo abc |grep 'a\.c'

#标准格式需要加'' 或者 " "

⑥ [root@localhost ~]# ls |grep '[zhou].txt'

⑦ [root@localhost ~]# ls [a-d].txt

#通配符

a.txt A.txt b.txt B.txt c.txt C.txt d.txt

⑧ [root@localhost ~]# ls |grep '[^a-z].txt'

⑨ [root@localhost ~]# ls |grep '[^a.z].txt'

#[]里就是本意不需要转义

⑩ [root@localhost ky15]#grep [[:space:]] zhen.txt

11 [root@localhost ky15]#grep [[:space:]] zhen.txt |cat -A

12 [root@localhost ~]#ls /etc/ |grep "rc[.0-6]" rc. rc0 rc1 rc2 rc3 rc6

root@localhost \~\]#ls /etc/ \|grep "rc\[.0-6\]." ②\[ \]:在正则表达式中\[ \]表示匹配\[ \]中任意一个字符 [root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹 [root@pc1 data]#ls #显示文件夹内容 a.txt b.txt c.txt [root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件 a.txt b.txt c.txt ![](https://file.jishuzhan.net/article/1752349898084192258/9f129cea7c1fd619d3710557612c1088.webp) ![](https://file.jishuzhan.net/article/1752349898084192258/cdca44376c87dec24bdd69fa7a6f720a.webp) ③\[\^\]:在正则表达式中表示匹配\[ \]中外的任意单个字符 [root@pc1 data]#touch {a..b}.txt #创建a-b.txt文件 [root@pc1 data]#touch {0..2}.txt #创建0-2.txt文件 [root@pc1 data]#ls #显示文件 0.txt 1.txt a.txt b.txt [root@pc1 data]#ls |grep '[^0-9].txt' #过滤ls显示文件中除去0-9任意字符.txt文件 a.txt b.txt c.txt [root@pc1 data]#ls |grep '[^a-z].txt' #过滤ls显示文件中除去a-z任意字符.txt文件 0.txt 1.txt 2.txt \[:alnum:\] 字母和数字 \[:alpha:\] 代表任何英文大小写字符,亦即 A-Z, a-z \[:lower:\] 小写字母,示例:\[\[:lower:\]\],相当于\[a-z

:upper:\] 大写字母 \[:blank:\] 空白字符(空格和制表符) \[:space:\] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比\[:blank:\]包含的范围广 \[:cntrl:\] 不可打印的控制字符(退格、删除、警铃...) \[:digit:\] 十进制数字 \[:xdigit:\] 十六进制数字 \[:graph:\] 可打印的非空白字符 \[:print:\] 可打印字符 \[:punct:\] 标点符号 [root@pc1 data]#echo AB12ab | grep -o '[[:alpha:]]' #过滤输出内容的字母 A B a b [root@pc1 data]#echo AB12ab | grep -o '[[:alnum:]]' #过滤输出内容的字母和数字 A B 1 2 a b [root@pc1 data]#echo AB12ab | grep -o '[[:lower:]]' #过滤输出内容的小写字母 a b [root@pc1 data]#echo AB12ab | grep -o '[[:upper:]]' #过滤输出内容的大写字母 A #### 2 表示次数 ① \* :表示匹配前面字符任意次,包括0次 [root@pc1 ~]#echo ac |grep 'ab*c' #ab之间不输入b可匹配 ac [root@pc1 ~]#echo abc |grep 'ab*c' #ab之间输入1个b可匹配 abc [root@pc1 ~]#echo abbc |grep 'ab*c'#ab之间输入2个b可匹配 abbc ② .\* :表示匹配前面字符任意次,包括0次 [root@pc1 ~]#echo ac |grep 'ab.*c' #ac之间不输入b匹配不到 [root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配 abc [root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配 abbc ③ \\? :表示匹配前面字符1次或0次,可有可无 [root@pc1 ~]#echo ac | grep 'ab\?c' #ac之间不输入b可以匹配 ac [root@pc1 ~]#echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配 abc [root@pc1 ~]#echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到 ④ \\+ :表示匹配前面字符最少1次。 [root@pc1 ~]#echo ac | grep 'ab\+c' #ac之间不输入b匹配不到 [root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配 abc [root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配 abbbbc ⑤ \\{n\\} :表示匹配前面的字符n次 [root@pc1 ~]#echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配 abbbc [root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到 ⑥ \\{m,n\\} :表示匹配前面字符最少m次最多n次 [root@pc1 ~]#echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配 abc [root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配 abbc [root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配 abbbc [root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到 ⑦\\{m,\\}: ⑧\\{,n\\}: #### 3 位置锚定 ① ^ 表示以什么字符开头的行。 ② $ 表示以什么字符为结尾的行。 ③ ^PATTERN$ 表示用于模式匹配整行 (单独一行 只有PATTERN字符)。 ④ ^$ 表示空行。 ⑤ \< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。 ⑥ \> 或 \b #词尾锚定,用于单词模式的右侧。 ⑦ \ #匹配整个单词。 举例 [root@pc1 ~]#cat a.txt #查看a.txt内容 root abc abd abf abe asfase asdfasfewe [root@pc1 ~]#cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行 abc abd abf abe asfase asdfasfewe [root@pc1 ~]#cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行 asfase asdfasfewe [root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行 root [root@pc1 ~]#cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词 abc abd abf abe asfase asdfasfewe [root@pc1 ~]#cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词 abc abd abf abe asfase asdfasfewe [root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc abc #### 分组 ()将多个字符捆绑在一起当做一个整体处理 [root@pc1 ~]#echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次 abcccc [root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到 [root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功 abcabcabcabc ### 文本三剑客之 grep grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 ![](https://file.jishuzhan.net/article/1752349898084192258/d5cf7347a0d36794c6964da80985f5e8.webp) ![](https://file.jishuzhan.net/article/1752349898084192258/1766e1ae838cdd370da03252697f6e47.webp) color 对匹配文件着色显示 ##### 案例 ### 二 扩展正则表达式 述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板,Linux工具可以用它来过滤文本 ①使用方法 grep -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \\ #### ②表示次数 \* 匹配前面字符任意次 ? 0或1次 + 1次或多次 {n} 匹配n次 {m,n} 至少m,至多n次 {,n} #匹配前面的字符至多n次,\<=n,n可以为0 {n,} #匹配前面的字符至少n次,\<=n,n可以为0 #### ③表示分组 () 分组 ### 三 文本三剑客之awk #### **工作原理:** 前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。 awk为流编辑器,即读取文件一行处理一行。不同于vi编辑器等是将文件整个缓存在内容中处理。 类似于excel表格,awk更是一门编辑语言,支持条件判断、数组循环等功能,适合小型的文本数据 格式: awk \[选项\] '处理模式{处理动作}' '{ }' 为固定格式 举例:取出sda硬盘的容量 [root@pc1 data]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 2G 0 part /boot └─sda2 8:2 0 54G 0 part ├─centos-root 253:0 0 50G 0 lvm / └─centos-swap 253:1 0 4G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk sdc 8:32 0 20G 0 disk sdd 8:48 0 20G 0 disk sr0 11:0 1 4.2G 0 rom [root@pc1 data]#lsblk |grep -w sda #通过过滤sda字符将sda此行过滤出 sda 8:0 0 60G 0 disk [root@pc1 data]#lsblk |grep -w sda | awk '{print $4}' #使用awk不指定分隔符 打印出第4列 60G #### 2 处理动作:主要以 print ①基本格式:awk \[选项\] '处理模式{处理动作}' ②print动作:打印,打印'{print $1}'即为打印第一列,'{print $n}'即打印为第n列,'{print $n,$m}'即为打印第n列和第m列。 ③print打印顺序:'BEGIN{print "1"} END {print "2"} {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3 最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印 举例2: [root@pc1 data]# awk 'BEGIN{print "1"} END{print "$2"} {print "3"}' test.txt 1 3 2 \[root@pc1 data\]#awk '{print $1,$5}' mcb.txt #使用awk处理文件mcb.txt打印第1列和第5列 ![](https://file.jishuzhan.net/article/1752349898084192258/dc623cbc3c9ea0df392683d1cc432d9d.webp) \[root@pc1 data\]#awk '{print $5}' mcb.txt #使用awk处理文件mcb.txt打印第5**列** \[root@pc1 data\]#awk '{print $1}' mcb.txt #使用awk处理文件mcb.txt打印第1**列** ![](https://file.jishuzhan.net/article/1752349898084192258/20880c6058677de246eec7a4d08cf577.webp) #### 3 选项 ①基本格式:awk \[选项\] '处理模式{处理动作}' ②选项若不写默认为以空格为分隔符处理,且会将空格自动压缩。 ③-F 选项 指定分隔符,即指定以什么为分隔符处理内容 举例: [root@pc1 data]#cat test.txt #编辑test.txt内容 one two three root:lisi:zhangsan [root@pc1 data]#awk '{print $2}' test.txt #默认过滤test内容以空格为分隔符打印出第2列为two two [root@pc1 data]#awk -F : '{print $2}' test.txt #使用-F选项指定以:为分隔符打印出第2列为lisi lisi ​​​​​​​ \[root@localhost \~\]#awk -F: 'BEGIN{print "hello" $1}{print $1}' /etc/passwd \| head ![](https://file.jishuzhan.net/article/1752349898084192258/953b050aa587c3345fe10532f2865e0b.webp) #### 4 处理模式 ①基本格式:awk \[选项\] '处理模式{处理动作}' ②处理模式为空表示无其他额外条件。 ③正则表达式匹配模式 正则匹配:与正则表达式配合使用。 举例: [root@pc1 data]#cat test.txt #创建test.txt root 1 abc 2 3 4 5 6 7 8 abcd sadfasdf root [root@pc1 data]#awk '/^root/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的行的第二列,注意处理模式在固定格式'{}'的单引号中 1 #匹配出的内容 [root@pc1 data]#awk '/^root/,/root$/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的且以root结尾的第二列,注意处理模式在固定格式'{}'的单引号中 1 root #匹配出的内容 #### 5 awk常见的内置变量 比较操作符:==, !=, \>, \>=, \<, \<= 逻辑操作符:\&\&与 并且的关系,\|\|或 或者关系,!非 取反关系 ①FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 "-F"作用相同 -v "FS=:" 两者意义一样 #awk -v FS=' : ' '{print $1 }' /etc/passwd ![](https://file.jishuzhan.net/article/1752349898084192258/1a64ee2dbbba48c7b425bc08fd8da7fb.webp) #awk -v FS=':' '{print $1FS$3}' /etc/passwd ![](https://file.jishuzhan.net/article/1752349898084192258/bd14838464815fb73afa5e31c24788bb.webp) \[root@localhost \~\]#awk -v FS=$fs '{print $1FS$3}' /etc/passwd \| head ![](https://file.jishuzhan.net/article/1752349898084192258/124d3a96d3a1cd3e4c7ed249146ea56b.webp) [root@pc1 data]#cat a.txt a:b:c [root@pc1 data]#awk -v "FS=:" '{print $2}' a.txt 使用FS变量指定:为分隔符打印a.txt文件的第二列 b ②OFS:输出时的分隔符 [root@pc1 data]#cat a.txt a:b:c [root@pc1 data]#awk -v "FS=:" -v OFS="==" '{print $1OFS$3}' a.txt 使用FS变量指定:为分隔符且指定输出分隔符OFS为==,打印a.txt文件的第1列和第3列 a==b \[root@localhost \~\]#awk -v FS=':' -v OFS='==' '{print $1,$3}' /etc/passwd \| head ![](https://file.jishuzhan.net/article/1752349898084192258/0c5b8c3d7f9f8d0a7b8ac4b57c0e2366.webp) ③NF:当前处理的行的字段个数即处理行有多少列,默认按空格分列,可指定。 举例 awk -F : '{print NF}' /etc/passwd |head -n 1 #指定:为分隔符打印出文件/etc/passwd第一行有多少个字段,即多少列 7 awk -F : '{print $(NF-1)}' /etc/passwd |head -n 1 #指定:为分隔符打印出文件/etc/passwd第一行的倒数第二个字段,即倒数第二列 /root ![](https://file.jishuzhan.net/article/1752349898084192258/4ea8ab86a0540a8c75787a519c57dec1.webp) ④NR:当前处理的行的行号(序数) 举例 awk -F : 'NR==1{print $1}' /etc/passwd #指定:为分隔符打印出/etc/passwd文件第一行的第一个变量,注意模式要写在'模式{}'位置 root awk -F : 'NR>=1 && NR<=3{PRINT $1}' /etc/passwd #指定:为分隔符打印出/etc/passwd文件大于等于第一行且小于等于第三行的第三个变量 root bin daemon ![](https://file.jishuzhan.net/article/1752349898084192258/807c5889e6b3b7dd9173a24795e24f16.webp) ⑤$0:当前处理的行的整行内容 #awk -F : 'NR==1{print $0}' /etc/passwd #指定:为分隔符打印出文件/etc/passwd第一行的所有内容 root:x:0:0:root:/root:/bin/bash awk -F : 'NR>=1 && NR<=3{print $0}' /etc/passwd #指定:为分隔符打印出文件/etc/passwd大于等于第一行且小于等于第三行的所有内容 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ``` ``` ⑥$n:当前处理行的第n个字段(第n列) ⑦FILENAME:被处理的文件名 ⑧RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\\n #echo $PATH \| awk -v RS=':' '{print $0}' ![](https://file.jishuzhan.net/article/1752349898084192258/1872e397f403942ac3dfe67da74237cb.webp) #### 打印磁盘已经使用情况 ![](https://file.jishuzhan.net/article/1752349898084192258/290a22d20cd54381f0eef1f0f4b3c4d2.webp) #cat /etc/passwd\|awk -F: '{print $1,$3}' #指定冒号作为分隔符,打印第一列和第三列 cat /etc/passwd\|awk -F: '{print $1":"$3}' #用冒号分隔开 ![](https://file.jishuzhan.net/article/1752349898084192258/db7ec9c2509717cbd0e84ea4ca52c034.webp) # cat /etc/passwd\|awk -F: '{print $1"\\t"$3}'![](https://file.jishuzhan.net/article/1752349898084192258/152ee4963a55e0a2f1e19884a2ef8246.webp) #### 以下三条意义一样 \[root@localhost \~\]#df\|awk -F"( +\|%)" '{print $5}' \[root@localhost ky15\]#df \|awk -F"\[\[:space:\]\]+\|%" '{print $5}' \[root@localhost ky15\]#df \|awk -F"\[ %\]+" '{print $5}' **疑问** **\[root@localhost \~\]#ifconfig ens33\|sed -n '2p' \|awk '{print $2}'** ![](https://file.jishuzhan.net/article/1752349898084192258/33ab6c6ee2a8220adc483eec28d22cea.webp) \[root@localhost ky15\]#hostname -I\|awk {print $1} 192.168.91.100 192.168.122.1 #### awk数组特性: * awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串 1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串 2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的 * awk数组支持数组的数组 #### ①提前十行访问量 #ss -nta\|awk 'NR!=1{state\[$1\]++}END{for(i in state){print i,state\[i\]}}' ![](https://file.jishuzhan.net/article/1752349898084192258/79be281ff124200f8b8b976fc6ca0b68.webp) #### 打印IP 子网掩码 网关 \[root@localhost \~\]#ifconfig ens33 \| awk '{print}' ![](https://file.jishuzhan.net/article/1752349898084192258/5618fa54efc37f4790155fc4e43f3f27.webp) \[root@localhost \~\]#ifconfig ens33 \| awk '/netmask/{print}' ![](https://file.jishuzhan.net/article/1752349898084192258/104b468bc0822772ac5ca18aad1e426b.webp) \[root@localhost \~\]#awk '{print $1,$3}' 打印第一列和第三列 \[root@localhost \~\]#awk -F: 'BEGIN{print "hello" $1}{print $1}' /etc/passwd \| head ![](https://file.jishuzhan.net/article/1752349898084192258/c3cf0687d35a4985d387e524ec11c8b1.webp) \[root@localhost \~\]#awk -F: 'END{print "hello" $1}{print $1}' /etc/passwd \| tail ![](https://file.jishuzhan.net/article/1752349898084192258/d1cb76d5341f202ea990be1dd8ba6f44.webp) #### 计算: \[root@localhost \~\]#awk 'BEGIN{print 100+200}' ![](https://file.jishuzhan.net/article/1752349898084192258/07a6aef59ddc8816fb240ac9030cceb9.webp) #### #分区利用率 \[root@localhost ky15\]#df\|awk '{print $5}' ![](https://file.jishuzhan.net/article/1752349898084192258/fc1c490c05d15a506181eae443795b6b.webp) \[root@localhost \~\]#df\|awk '{print $5}' \| tail -n 2 \[root@localhost \~\]#df\|awk '{print $5}' \| tail -n 2 \| tr -d % \[root@localhost \~\]#df\|awk -F"\[ %\]+" '{print $5}' \| tail -n 2 ![](https://file.jishuzhan.net/article/1752349898084192258/aeb21e0b221b3ae7fd590517fb061d54.webp) ![](https://file.jishuzhan.net/article/1752349898084192258/70d7b5e0b01adf0f1fedf8dd4105aa93.webp) #### 面试题 ### 四文本三剑客之sed ##### 1 定义 * sed编辑器是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来**编**辑数据流。 * sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中。 作用:在打不开文件的情况下,修改文件 语法:输出那些行,留下那些行 #### 2.工作流程 **读取:** sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。 **执行**:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。 **显示:**发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。 #### 3 命令选项: -n 关闭自动打印 -e 多点编辑:\[root@www data\]#sed -n -e '/\^r/p' -e'/\^b/p' /etc/passwd -f 从指定文件中读取编辑脚本 -r, -E 使用扩展正则表达式 -i.bak 备份文件并原处编辑 #### 4 基本操作 ![](https://file.jishuzhan.net/article/1752349898084192258/6e0363d0df9a691c3e990d5a3d0a42b9.webp) 以mcb.txt文本内容为模板验证 ![](https://file.jishuzhan.net/article/1752349898084192258/5848a491be6c9b56185ac543849ebde0.webp) #### 打印内容 #sed ' ' #交互模式输入一行,自动打印一行相同的 ![](https://file.jishuzhan.net/article/1752349898084192258/7a282f8e4319941d6a466ef9fb7a57b2.webp) ①\[root@localhost \~\]#sed ' ' mcb.txt 默认将输入内容打印出来 ![](https://file.jishuzhan.net/article/1752349898084192258/f3f0495c9961ffc64457c626e2159f01.webp) ①打印显示mcb.txt文本 ![](https://file.jishuzhan.net/article/1752349898084192258/8d2e302315fc292ee447a209b103aaac.webp) #sed -n '3p' mcb.txt #打印第三行内容 ![](https://file.jishuzhan.net/article/1752349898084192258/a523a6cf170ce3599606b08f20d426f2.webp) #sed -n ' 1,3p ' mcb.txt 打印第一行到第三行 ![](https://file.jishuzhan.net/article/1752349898084192258/8d1bc04141b81a8cd84e522a18ec9c4a.webp) #sed -n '$p' /etc/passwd #打印最后一行使用通配符 ![](https://file.jishuzhan.net/article/1752349898084192258/fb2aa142bf6ca3c0b5e2848c7350cc01.webp) # sed '3q' mcb.txt #打印三行后退出 ![](https://file.jishuzhan.net/article/1752349898084192258/8978519943a3e198bce9f2065ef6a767.webp) \[root@localhost \~\]#sed -n 'n;p' mcb.txt 输出文件内容所有偶数行 ![](https://file.jishuzhan.net/article/1752349898084192258/2df6f1ba0435ea16e9603c7a700926da.webp) \[root@localhost \~\]#sed -n '3,${n;p}' mcb.txt 输出第三行至文件尾之间的偶数行 ![](https://file.jishuzhan.net/article/1752349898084192258/d9ea268dc7f11c2aa7e3ae1692b13064.webp) #sed -n '/the/p' mcb.txt 显示包含/the/的行 ifconfig ens33 \|sed -n '2,4p' #打印网卡信息的2至4行 ![](https://file.jishuzhan.net/article/1752349898084192258/9d9afa681c88ece9de61781ab9e294de.webp) #cat -n /etc/passwd \|sed -n '2,+4p' #打印第2至6行,即第二行开始往后四行 sed -n ' ' #交互模式输入一行,关闭自动打印 sed -n ' p' #加上p又恢复自动打印,与sed ' '相同 查找文件内容 与cat功能一样 sed ' ' /etc/fstab sed -n ' p' /etc/fatab #### 过滤关键字 #sed -n '/man/p' /etc/passwd #从第二行开始,找到man 为止 ![](https://file.jishuzhan.net/article/1752349898084192258/13949a002590f19a39a580a3a95dcef2.webp) #### 匹配关键字 #sed -n '2,/man/p' /etc/passwd 从第#行开始匹配 #从第二行开始,找到man为止 #### ![](https://file.jishuzhan.net/article/1752349898084192258/8556fa7f1a54605103a69a089fdbead3.webp) #### nl 打印文件的行数![](https://file.jishuzhan.net/article/1752349898084192258/ee22e561eb5209b5ec188defa1d7b72b.webp) #ifconfig ens33\|sed -n '2p' \|awk '{print $2}' 查看虚拟机IP地址 ![](https://file.jishuzhan.net/article/1752349898084192258/c571573e26117a40267e20b340a1120f.webp)\[root@localhost \~\]#ifconfig ens33 \| sed -n '2p' IP 网关 子网掩码 ![](https://file.jishuzhan.net/article/1752349898084192258/62448511653dbc9e2aba2a609f771257.webp) #### 奇偶行 seq 10 |sed -n '1~2p' seq 10 |sed '2~2d' #打印奇数行 seq 10 |sed -n '2~2p' seq 10 |sed '1~2d' #打印偶数行 #### 删除内容 cat 1.txt |sed '3d' #删除第三行并显示出来 注 删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了 sed '2,4d' seq.txt #删除连续的2到4行 sed '/^$/d' /opt/seq.txt #删除文本中的空行 sed '/nologin$/!d' /etc/passwd #删除不是以nologin结尾的行 sed '/nologin$/!d' /etc/passwd #删除不是以nologin结尾的行 #### 备份再删除 sed -i.bak '3d' 1.txt #原文件删除第三行,并原文备份 #### 插入内容 sed -i '2a charu' 1.txt #在第二行后插入内容 sed -i '2a\\n charu2' 1.txt #插入空行,多添加一个\ #### 替换行内容 sed -i '2ctihuan' 1.txt #将第二行的内容替换成tihuan #### 取反 seq 10|sed -n '2!p' #不显示第二行 #### 搜索替代 ①查几点到几点之间的日志 sed -n '/2023:08:09/,/2023:09:42:37/p' access_log ②修改全局,后加g sed -i 's/root/admin/g' /etc/passwd #将全局出现的root修改为admin #### ③修改多行,使用r及e #### ④修改selinux开机不启动配置文件 举例: seq 5 |sed #生成1-5数字传给sed #该格式报错,基本格式中的'{自身脚本语法}'不可以不写,可以写空则是默认打印全部内容如下 seq 5 | sed '' 1 2 3 4 5 2、sed脚本语法及命令 ①sed脚本语法:地址+sed自己脚本命令,地址即范围例如全文或第一行,第一行至第三行等范围 ②sed脚本命令: p 将内容打印到屏幕,使用时关闭自动打印功能,-n选项 ![](https://file.jishuzhan.net/article/1752349898084192258/142ee56f7578d7ab0b7569ef29a7533d.webp) #### 打印内容 q 到指定的内容即退出,例如打印到第三行直接退出 ![](https://file.jishuzhan.net/article/1752349898084192258/32d6798b6f4d55e924fd4b9a74e3f1b7.webp) IP 内容忽略大小写,使用时关闭自动打印功能,-n选项 #### ![](https://file.jishuzhan.net/article/1752349898084192258/60c54038f5fec5cedddafa174d469b71.webp) 删除 插入 d 删除指定内容 a 在指定位置添加内容 c 替换指定内容 ![](https://file.jishuzhan.net/article/1752349898084192258/075c155a1d86e718109c279ac51a4186.webp) \~ 步进,0\~2,2个间隔,1\~2,1个间隔 seq 10 \|sed -n '0\~2p'每间隔2个打印一次 ![](https://file.jishuzhan.net/article/1752349898084192258/ae2fb4781f3116604512b7cab0be000b.webp) #### sed选项 ① -n 选项,sed默认有自动打印功能,-n选项是关闭打印功能,一般配合脚本命令p使用 ②-r 选项,开启扩展正则表达式 ③-i 选项,在文件中添加内容,可以在-i是加.bak后缀备份修改的文件。例如 sed -i.bak a.txt会在同目录下生成一个a.txt.bak文件 ④ ⑤ ![](https://file.jishuzhan.net/article/1752349898084192258/aab85a23ea9561ebd7766ad63fb265f3.webp) ![](https://file.jishuzhan.net/article/1752349898084192258/d8c7bea2881ebda25e5deecb2108bc0d.webp) #### 查找 替换 格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换 注意:查找内容可使用正则表达式,替换内容不可使用正则表达式 举例1: 搜索/etc/passwd 中包含root字符的行 sed -nr '/root/p' /etc/passwd #-n关闭自动打印,-r启用扩展正则表达式查询root字符并打印 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #查询结果 举例2: 使用sed关闭selinux cat /etc/selinux/config #查看selinux配置文件内容 # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #-i选项备份selinux配置文件后缀加.bak,在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。单引号中''s之前可加行号 ##### 后向引用 ( )内的按顺序标为123 ,引用时\\1调用第一个()的内容,\\n表示调用第n个()的内容。 .\*表示任意长度字符不管是什么字符 举例1:取ip地址 ifconfig ens33 |sed -nr 's/.*inet (.*) netmask.*/\1/p' #查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式 's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用 .*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的 内容,p表示打印出来 192.168.30.11 #打印结果 举例2: echo abc123XYZ | sed -nr 's/(abc)(123)(XYZ)/\3\2\1/p' #打印abc123XYZ传给sed处理变成XYZ123ABC,-n选项关闭自动打印,-r选项开启扩展正则表达式 's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序 XYZ123abc #打印结果 ##### 变量 使用sed查询是可以直接调用变量,注意必须用" "号或者俩个双引号,单引号不识别变量

相关推荐
fs哆哆17 小时前
在VB.net中,用正则表达式方法清除干扰符号方法
开发语言·正则表达式·c#·.net
奔跑吧邓邓子2 天前
正则表达式:开启文本处理的魔法之门
正则表达式·文本处理·高效应用
相知-.3 天前
shell正则表达式
linux·运维·正则表达式
面朝大海,春不暖,花不开4 天前
使用 Python 正则表达式实现文本替换与电话号码规范化
python·mysql·正则表达式
前端小白从0开始5 天前
关于前端常用的部分公共方法(二)
前端·vue.js·正则表达式·typescript·html5·公共方法
岁忧5 天前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 下
sql·leetcode·正则表达式
岁忧5 天前
MySQL中【正则表达式】用法
数据库·mysql·正则表达式
htj107 天前
C# 使用正则表达式
正则表达式·c#
ZZZKKKRTSAE7 天前
快速上手Linux全局搜索正则表达式(grep)
linux·服务器·正则表达式
Kusunoki_D7 天前
Python-正则表达式(re 模块)
python·正则表达式