Linux三剑客

文章目录

一、正则表达式

由特殊字符和文本字符组成编写模式。主要分类:

  • 基本正则表达式BRE
  • 元字符有:^$.[]*
  • 作用:1、匹配字符;2、匹配字符次数;3、位置锚定
  • Linux三剑客_bash

  • 扩展正则表达式ERE
  • 元字符有:(){}?+| (包括BRE)
  • 必须使用​​grep -E​​ 才能生效
  • Linux三剑客_shell_02

1.2正则表达意义:

  1. 处理大量的字符串 (提取关键字信息、文件信息、网站信息)
  2. 处理文本(替换功能)
  3. 正则表达式必须使用Linux三剑客去操作它。

二、Linux三剑客grep

  • ​grep​​:文本搜索、过滤工具
  • Linux三剑客_shell_03

2.1、grep练习

##首先连接文件passwd并打印输出到 pwd.txt文件中
[root@1-VM00013 ~]# cat /etc/passwd > ./pwd.txt

##开始搜索过滤,不区分大小写,查找pwd.txt文件中含有root字样的字符
[root@1-VM00013 ~]# grep -i "root" pwd.txt
root:x:0:0:root:/root
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:988:98

##把行号显示出来,查找pwd.txt文件中含有root字样的字符
[root@1-VM00013 ~]# grep -i -n "root" pwd.txt
1:root:x:0:0:root:
10:operator:x:11:0:operator:/root:/sbin/nologin
42:dockerroot:x:

##统计pwd.txt文本中,有多少行root有关的字符
[root@1-VM00013 ~]# grep -i "root" ./pwd.txt -c
3
[root@1-VM0001
##找出所有的非空行
思路是先找出所有的空行,然后结果取反
[root@1-VM00013 data]# cat luffy.txt
I am linghu

I teach linux

i like python

my name is linghu

[root@1-VM00013data]# grep '^$' luffy.txt




##查看空行的行号:
[root@1-VM00013 data]# grep '^$' luffy.txt -n
2:
4:
6:
8:

##把结果取反
[root@1-VM00013 data]# grep '^$' luffy.txt -n -v
1:I am linghu
3:I teach linux
5:i like python
7:my name is linghu

现在在文本中加入注释行,我们要排除注释行:

Linux三剑客_bash_04

[root@1-VM00013 data]# grep '^$' luffy.txt -v | grep '^#' -v

2.2、找出所有以m开头的行

[root@1-VM00013 data]# grep -i -n '^m' luffy.txt
7:my name is linghu

2.3、输出所有以m开头的行

[root@1-VM00013 data]# grep -i -n '^m' luffy.txt |grep -i -n '.*
1:7:maybe
2:9:my boy is you
3:11:my name is linghu

2.4输出所有以i开头的行

[root@1-VM00013 data]# grep -i -n '^i' luffy.txt |grep -i -n '.*
1:1:I am linghu
2:3:I teach linux
3:5:i like python

2.5找出所有允许登录的用户,解释器是/bin/bash的行

[root@1-VM00013 data]# cat /etc/passwd > ./pwd.txt
[root@1-VM00013 data]# grep -n "/bin/bash$" pwd.txt
1:root:x:0:0:root:/root:/bin/bash
41:zshield:x:1000:1000:zshield:/home/zshield:/bin/bash
44:testlinghu:x:94619:94619::/home/testlinghu:/bin/bash

##只输出匹配的内容
[root@1-VM00013 data]# grep -n "/bin/bash$" pwd.txt -o
1:/bin/bash
41:/bin/bash
44:/bin/bash


##找出s匹配的内容
[root@1-VM00013 data]# grep ".s" luffy.txt
my boy is you
my name is linghu
#zhushi bu huai bei du qu
[root@1-VM00013 data]#

Linux三剑客_sed_05

  • ​sed​​:文本编辑工具
  • ​awk​​:文本报告生成器

三、sed与正则表达式

sed对文件实现快速的增删改查,模式匹配。

3.1、输出文件第二行、第三行

[root@1-VM00013 data]# sed "2,3p" luffy.txt -n

3.2、过滤出含有“Linux”字样的文本

[root@1-VM00013 data]# sed "/linux/p" luffy.txt -n

3.3、删除含有game的行

[root@1-VM00013 data]# sed "/game/d" luffy.txt -i

3.4、全局替换,将my换成i

[root@1-VM00013 data]# sed "s/My/I/g" luffy.txt -i

四、sed配合正则表达式企业案例

4.1、取出linux的ip地址【去头去尾】

Linux三剑客_bash_06

上图,通过三个管道符对命令进行过滤。

五、Linux三剑客awk

​awk​​适合处理匹配到的文本。

​awk​​更像是一门编程语言,支持条件判断、数组、循环等功能。

一、
用awk '{printf $0}' change.txt可以打印chage.txt所有的数据

二、
用awk '{printf $1$2}' change.txt可以打印第一列和第二列的数据(可以加逗号)
用awk '{printf "第一列:"$1,"第二列:"$2,"第三列:"$3}'

Linux三剑客_linux_07

5.1、显示文件第五行

Linux三剑客_shell_08

Linux三剑客_shell_09

5.2、输出第一行到第三行

Linux三剑客_linux_10

5.2、利用awk取出ip地址信息

Linux三剑客_shell_11

5.3、awk做分隔

首先看一下测试文件pwd.txt里的用户:

Linux三剑客_sed_12

我们来做一个分隔,分割出第一列用户信息:

Linux三剑客_shell_13

5.4、awk变量

一、自定义变量

[root@1-VM00013 data]# awk -v myname="令狐" 'BEGIN{print "我的名字是:",myname}'

二、变量赋值

[root@1-VM00013 data]# myname="令狐荣豪"
[root@1-VM00013 data]# echo $myname
令狐荣豪
[root@1-VM00013 data]# awk -v awk_name=$myname 'BEGIN{print awk_name}'

5.5、awk模式pattern

Linux三剑客_bash_14

Linux三剑客_shell_15

六、at与mailx命令

6.1、linux定时任务

[root@1-VM00013 ~]# at now+1min
at> touch /tmp/linghu.txt
at> <EOT>
job 1 at Fri Apr 29 14:21:00 2022