企业常用Linux正则表达式与三剑客/企业生产环境及知识/企业中远程连接ssh工具(为什么连接有时慢?)

企业高薪思维:
1.学习去抓重点有价值知识
2.猛劲学,使劲学(能否给别人将会,讲明白,写明白,练习明白),在学习过程中你觉得学会了60-80%,其实你只会了40-50%,你要讲明白会操作,类似于1+1=2顺口成章一种记忆,面试中你给HR的感觉,和身边同类人专业度是不一样的!
为什么要有爱好?
1.横向交往不同【层次】人脉。
你认识多少没有什么用,有多少人认识你才是你的价值。
2.释放工作、生活、学习带来的各种压力。
3.认识你的另一半,有相同爱好两个人。
为什么要有特长?
1.带给人自信。
自信是成功的前提。
2.横向交往不同【层次】人脉。
把和你的特长有相同爱好的人成为你的粉丝。
3.让你失败的时候能够东山再起。

企业常用Linux正则表达与三剑客知识

正则表达

处理大量字符串文本定义的一套规则与方法

Linux三剑客正则表达式特点

  1. 工作上,一次处理一行
  2. 正则表达式可以将复杂的任务处理为简单的,提高操作Linux效率
  3. 仅被三剑客(grep/egrep,sed,awk)命令支持

正则表达式:为过滤特殊字符串而生

正则表达式与通配符有本质去别的:
通配符:所有的命令支持
正则表达式只支持三剑客

在centos6 之前是没有这一种标记的,centos7开始官方加上了这个标记(alias egrep=’egrep --color=auto‘)
在这里插入图片描述
在这里插入图片描述

LC_ALL环境变量设置

我们以后在工作中/安装好虚拟机,安装对应的yum/epel/网络工具时候,后面也可以进行配置LC_ALL(三剑客环境变量配置)

建议配置:配置后操作时不会出现异常匹配情况(export LC_ALL=C)
在这里插入图片描述
在命令行输入:
vim etc/profile编辑输入:
export LC_ALL=C并保存
在这里插入图片描述
. /etc/profile运行文件
echo $LC_ALL是否有C显示,有就是成功,否则重新来一遍配置操作
在这里插入图片描述
第二种处理方式:

EOF后面不要用多余的空格:
cat >>/etc/profile<<EOF
alias grep=‘grep --color=auto’
alias egrep=‘egrep --color=auto’
export LCALL=C
注意:eof前后都没有空格和其他符号
EOF
使用修改的内容生效
source /etc/profile

正则表达式的分类

基本正则表达式:
BRE对应的元字符:^$.[]*

扩展正则表达式:
ERE在BRE基础上增加了(){}?+|

基础正则表达式

实验环境:
mkdir ~/test -p
cat >~/test/wulin.txt<<EOF
i am wulin!
i study linux.

i like playgames ,and chinese chess!
my qq num is 99999999.

not 6763873677
EOF

给过滤的内容添加标识,把符合的标识内容过滤
^ 尖角号,^wulin,表示匹配以wulin为单词开头的行
在这里插入图片描述
$ 美元符,wulin$,表示匹配以wulin单词结尾的行
在这里插入图片描述

^ $组合符,表示空行(以 结尾的行)或者以 开头的行
在这里插入图片描述

. 点号,匹配任意的一个且只有一个字符
在这里插入图片描述

\转义符,特殊含义的字符让本有的含义显出原形(不受别的含义干扰)
在这里插入图片描述

(*) 重复前一个字符(来纳许0次或1次以上,当为0次的时候,表示什么也没有)
(0 * )所有的都出来了:
在这里插入图片描述

(. * )匹配所有的内容
在这里插入图片描述

(^. *) 匹配任意多个字符结尾的内容
( . *$)任意多个字符结尾的内容
[abc]匹配[]集合内的任意一个字符a,b,c;

([abc]匹配不包含 后面的任意字符a,b,c
,这里的^表示对[a,b,c]的取反,不能用!进行替代

测试题

1.过滤/etc/passwd中以nologin结尾的行
在这里插入图片描述

2.过滤/etc/passwd中以o开头的行
在这里插入图片描述

3.过滤/etc/passwd中至少含有1个0字符串的行
在这里插入图片描述

4.过滤/etc/目录中(不含子目录)下的所有文件
在这里插入图片描述

5.过滤/etc/services中含有点号的行
grep "." /etc/services

扩展正则

条件:grep -E====egrep
(+)匹配前一个字符1次或多次

区别,可以匹配0次
匹配0个0,或1个0,或多个0
[root@calms test3]# grep "0
" wulin.txt
匹配一个0或多个0
[root@calms test3]# grep “0*” wulin.txt

[ : /]+ 匹配括号内的:或/字符1次或多次
egrep “[: /]+” wulin.txt

egrep -o 参数把匹配的内容放在一列进行打印

?匹配前一个字符0次或1次

| 表示或者,同时过滤多个字符串
egrep “000|wulin” wulin.txt

0 分组过滤括起来的东西表示一个整体,另外0的内容可以被后面的\n进行引用,n为数字,表示引用第几个括号的内容

\n 引用前面()括号内的内容

a{n,m}匹配前一个字符最少n次,最多m次

a{n,}匹配前一个字符最少n次

a{n} 匹配前一个字符正好n次

a{,m}匹配前一个字符最多m次

特殊预定义表达式(了解)

在这里插入图片描述
[root@calms test]# egrep “[[:alnum:]]” wulin.txt
I am wulin!
I study linux.
I like playgames,chinese chess!
our site is http://www.wulincsdn.com
qq num is 99999999.
not 4900000448.
i am not wulin,but WULINS!
:d::f
etc/wulin//
[root@wulin test]# egrep “[[:alpha:]]” wulin.txt
I am wulin!
I study linux.
I like playgames,chinese chess!
our site is http://www.wulincsdn.com
qq num is 99999999.
not 4900000448.
i am not wulin,but WULINS!
:d::f
/etc/wulin//
[root@wulin test]# egrep “[:digit:]” wulin.txt
grep: character class syntax is [[:space:]], not [:space:]
[root@wulintest]# egrep “[[:digit:]]” wulin.txt
qq num is 99999999.
not 4900000448.

A after 显示过滤的字符串和它之后的多少行
-B before 显示过滤的字符串和它之前的多少行
-C context 显示过滤的字符串和它之前之后的多少行
[root@wulin test]# grep -A 3 5 b.txt
5
6
7
8
[root@wulin test]# grep -B 3 5 b.txt
2
3
4
5
[root@wulin test]# grep -C 3 5 b.txt
2
3
4
5
6
7
8

元字符表达式(了解)

在这里插入图片描述
在这里插入图片描述

Sed流编辑器(Linux三剑客老二)

对文件实现快速增删改查,查询最强大的是取行与替换

取行和替换
sed [选项] [sed内置命令字符] [输入文件]

options[选项] 解释说明

  1. -n取消默认的sed输出,常与sed内置命令的p连用
  2. -i 直接修改文件的内容,而不是输出到终端 如果不使用-i选项sed只是修改在内存中的数据,并不会影响磁盘上的文件
    修改前备份,修改后检查(在备份的时候,cp –i.bak做替换的时候用bak作为扩展名,先备份完在进行做替换)

修改文件并备份:
cp wulin.txt{,.ori}
ls
sed ‘/wulin/d’ wulin.txt
wulun.tsed -i.bak '/wulin/d’wulin.txt(修改源文件前备份)
ls
怎么看改没改成功?
〉Windows专业比较工具bcompare

vimdiff(查看2个文件差异,更直观)
vimdiff wulin.txt wulin.txt.bak(wulin.txt为修改的文件,wulin.txt.bak为源文件)
操作后左右两边有对比功能,红色为修改过的内容

diff查看2个文件差异
diff wulin.txt wulin.txt.bak

  1. -e 允许多次编辑
  2. –r 支持扩展正则表达式

p 全拼为print,表示打印

d delete 删除(在文件中删除内容)
问题:删除含有wulin字符串的行
sed -n ‘/wulin/d’ wulin.txt’

问题:2-4行删除
删除前查看
sed '2,4p’wulin.txt
sed '2,4d’wulin.txt
sed = '2,4d’wulin.txt(=为sed的显示行号,存在问题不是一行显示内容)

cat –n显示行号,grep –n “.” wulin.txt也可以显示行号

s sub 替换(在文件中修改内容)
g global 全局替换
问题:将文件中的wulin字符串全部替换为wulinsckg*
sed ‘s#A#B#g’ 三个#理论上可以用任意字符,
sed -i.bak ‘s#A#B#g’
因为之前在案例中删掉了wulin.txt(但是我们在操作前已经进行了备份)cp wulin.txt.bak wulin.txt
会有提示符,输入y即可
cat wulin.txt(查看还原的内容是否回来)
sed ‘s#wulin#wulinsckg#g’ wulin.txt
会发现内容进行了替换
sed –i.bak ‘s#wulin#wulinsckg#g’ wulin.txt
vimdiff wulin.txt wulin.txt.bak(可以看到两边修改前后,及删除内容对比)

a append 追加(在文件中增加内容)

问题:在wulin.txt文件第二行后追加文本
cat –n wulin.txt
sed -i ‘2a i am wulint’ wulun.txt
vimdiff wulin.txt wulin.txt.bak(两边做了对比,并且在左边的第二行进行追加内容)

i insert 当前插入

问题:在wulin.txt文件的第二行插入文本
sed –i ‘2i i study linux’ wulin.txt
(在第二行插入,原来的第三行移动到第二行)
vimdiff wulin.txt wulin.txt.bak

= 显示行号
() \1 后向引用

练习题

1.取/etc/passwd中第5–15行,重定向到/test.txt
sed –n ‘5,15p’ /etc/passwd〉/test.txt
cat -n /test.txt

2.把/test.txt中以/sbin/nologin结尾的,都修改为/bin/bash

sed -i.bak ‘s#/sbin/nologin#/bin/bash#g’ test.txt

3.查找包含nobody的行
sed -n’/nobody/p’ /test.txt

4.第8行,插入#i am wulin
sed ‘8i i am wulin’ /test.txt
sed –i ‘8i i am wulin’ /test.txt
(补充
sed = ‘8i i am wulin’ /test.txt可以显示行号,但是会存在一个问题行号与内容没有在一行,如果要解决解决方式?
sed = ‘8i i am wulin’ /test.txt|sed ‘N:s/\n/ /’

5.删除9-14行,并修改文件
sed -i ‘9,14d’ /test.txt

问题:在wulin.txt文件的第二行插入两行文本
srd ‘2i i study linux \n’ test.txt

生产场景:配置ssh参数的案例
在文件中增加参数设置
egrep “Port” /etc/ssh/sshd_config
egrep “#Port” /etc/ssh/sshd_config
egrep “#Port|root” /etc/ssh/sshd_config
egrep “#Port|login” /etc/ssh/sshd_config
egrep -i “#Port|#PermitRootLogin” /etc/ssh/sshd_config
egrep -i “#Port|#PermitRootLogin|UseDNS” /etc/ssh/sshd_config
egrep -i “#Port|#PermitRootLogin|UseDNS|” /etc/ssh/sshd_config
egrep -i “#Port|#PermitRootLogin|UseDNS|GSSAPIAuthentication yes” /etc/ssh/sshd_config

根据上面案例解释了在企业中远程连接ssh工具,需要一定的配置(为什么连接有时慢?)

#Port 52113 (默认22断开,黑客也是知道这个端口,工作中这里要改)
#PermitRootLogin yes(禁止root远程登录)
GSSAPIAuthenyication no(解决连接慢)
UseDNS no (解决连接慢)
在后面集群架构阶段要求会一键化搭建
到时候怎么搭建?
sed ‘13i Port 52113\nPermitRootLogin no\nGSSAPIAUthentication no\nUseDNS no’ /etc/ssh/sshd_config
(这里我假如13行,这里大家学习先别进行修改,否则大家ssh远程连接不了,在企业中是要进行改的)

企业中一般我们会加上等号
sed ‘13i #===\nPort 52113\nPermitRootLogin no\nGSSAPIAUthentication no\nUseDNS no\n#=’ /etc/ssh/sshd_config

在命令行输入
sed –i.bak’13i #===\nPort 52113\nPermitRootLogin no\nGSSAPIAUthentication no\nUseDNS no\n#=’ /etc/ssh/sshd_config
查询:
sed -n ‘13,20’ /etc/sshd_config
sed -n ‘13,18p’ /etc/sshd_config

重启
systemctl restart sshd
(如果不这样做,需要vim编辑/etc/ssh/sshd_config文件,将其内容写入到vim这个文件)

取出Linux中执行ifconfig etho 后对应的IP地址(只能输出IP地址)

方法一:利用正则➕sed替换功能取ip
ifconfig eth0
ifconfig eth0|sed -n ‘2p’
取出来为
inet 10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255

ifconfig sed -rn’2s###gp’
目标:10.0.0.130
1.干掉ip前面的部分
10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255

2.干掉ip后面的部分
10.0.0.130
技巧:
想要的目标是10.0.0.130,干掉它前面的内容^.*net(如果broadcast后面还有一个inet的话,要进行区分这里变成星点net,如果有空格也可以加上空格,以任意多字符开头,给一个唯一结尾的内容)

ifconfig eth0|sed -rn ‘2s#^.星inet ##gp’
10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255

net.*$(net前面有空格)以唯一的内容开头,任意多个字符结尾
ifconfig etho|sed -rn '2s#^.星inet ##gp’|sed -rn
‘s# net.星美元符号##gp’
10.0.0.130

测试题

  1. 取ip a结果的第一块网卡ip
    ip a
    ip a|grep eth0
    ip a|grep eth0|sed -n 2p
    ip a|grep eth0|sed -n 2p|sed -rn ‘s#^.*net ##gp’
    ip a|grep eth0|sed -n 2p|sed -rn 's#^.*net ##gp’|sed -rn ‘s#/B.星$##gp’

一条命令解决:
ip a|sed - rn ‘$#^.*inet(.星)/8 b.星美元符号#\1#gp’

2.取stat /etc/hosts中的数字权限644
stat /etc/hosts
stat /etc/hosts|sed -rn ‘4s#^.*(0##gp’
stat /etc/hosts|sed–rn '4s#^.星\(0##gp’|sed -rn ‘s#/-.星$##gp’

一条命令:
stat /etc/hosts|sed – rn ‘4s#^.*\(0(.星)/–.星$#\1#gp’

用一条sed命令来实现取IP

后向引用:
想要的内容要用括号括起来匹配,因为后面好把它拿出来。()\1进行取出来
ifconfig eth0|sed –rn ‘s#^.星inet (.*) net.星$#\1#gp’
如果inet (. *) 这两个之间没有空格讲会出现,ip后面有空格(不能精准执行)

补充–e多项编辑可以实现减少管道使用

ifconfig eth0|sed -ne ‘2s#^.*inet ##g’ -ne ‘2s# netm.星$##gp’

下一篇给大家写awk知识点,上面常见的sed用法写到这里后面,会给大家更新与补充!

1) 案例01: 取出文件的第3行 ⭐⭐⭐⭐⭐

-n表示取消默认输出,sed处理文件的时候会默认的输出每一行内容.
sed -n ‘3p’ /etc/passwd

2) 案例02: 取出/etc/passwd的第2行到第5行

⭐⭐⭐⭐⭐
sed -n ‘2,5p’ /etc/passwd

3) 案例03: 过滤出/etc/passwd中包含root的行

⭐⭐⭐⭐⭐
⚠ 注意
sed进行过滤的时候需要使用//ˌ并且里面支持基础正则
如果需要使用扩展正则需要使用sed -r选项

grep ‘root’ /etc/passwd
[root@calms~]# sed -n ‘/root/p’
/etc/passwd
root :x :0:0:root:/root:/bin/bash
operator:x :11:0:operator:/root:/sbin/nologin
[root@calms~]#
[root@calms~]# sed -n ‘/^root/p’
/etc/passwd
root:x :0:0:root:/root:/bin/bash

获取范围内的日志 ⭐⭐⭐⭐⭐

试着取出access.log过滤出11:05分到11:06分的日志
cat >/wulin/sed.txtEOF
101,wulin,CEO
102,wulin,CTO
103.wulin996,COO
104,yy,CFO
105,feixue,CIO
110,wuluin,COCO
EOF
1
2
3
4
5
6
7
8
[root@calms~]# sed -n ‘/102/ , /105/p’ sed.txt
102,bbao,CTO
103,wulin996,COO
104,yy,CFO
105,feixue,CIO

增删改查之替换-进阶

后向引用格式

应用说明:
后向引用或反向引用: 适用于sed命令处理/提取一行中的某一部分.sed命令配合正则实现取列.(类似于awk取列)

sed命令中用于处理列的方式.

使用格式:
使用替换的形式 s###g
前2个井号之间通过正则与(),对数据进行分组.
后面2个井号之间通过\数字,去调用前面分组的内容.
整体是后面调用前面分组的内容,称之为反向引用/后向引用.
应用场景: 某一行中对部分数据进行加工与处理,提取某一部分数据

输出12345678
通过sed加工变成1<234567>8
echo 12345678 |sed -r ‘s#(1)(.*)(8)#\1<\2>\3#g’
1<234567>8

案例 取出网卡ip地址

方法01
[root@calms~]# ip a s eth0 | sed -n
‘3p’ | sed -r ‘s#^.et ([0-9.]+)/.$#\1#g’

10.0.0.200
方法02 进阶
sed -n ‘3p’+ sed -r ‘s#^.et ([0-9.]+)/.$#\1#g’

= sed -nr ‘3 s#^.et ([0-9.]+)/.$#\1#g p’
方法03 awk

[root@calms~]# ip a s eth0 | sed -n
‘3p’ |awk ‘{print $2}’ |sed ‘s#/24Վˁg’
10.0.0.200

方法04 awk
[root@calms~]# ip a s eth0 | sed -n
‘3p’ |awk -F “[ /]+” ‘{print $3}’
10.0.0.200

方法05-06 awk
ip a s eth0 | sed -n ‘3p’ |awk -F “[ /]+” ‘{print
$3}’
[root@calms~]# ip a s eth0 | awk -F "
[ /]+" ‘NR=3{print $3}’
10.0.0.200

方法07
hostname -I

取出stat /etc/hosts中的0644或644

[root@calms~]# stat /etc/hosts |sed -
n ‘4p’ | sed -r ‘s#^.(([0-9]+)/.$#\1#g’
0644

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值