linux基础命令 - 文件处理三剑客(grep - awk - sed)

目录

文本处理三剑客: 

    1、grep/egrep     查找(文本过滤)

    2、awk        截取

    3、sed        替换

一、正则表达式:

什么是正则表达式,它有什么作用?

正则表达式:

1.基本正则表达式(包括元字符的个数是有限的)        ^ $  +

2.扩展正则表达式        ? {4,6}  |    

正则表达式的元字符有哪些:

二、grep命令

什么是grep命令,它的选项有哪些,它在文本处理中起什么作用呢?

1、grep命令的基本语法与常用选项:

2、grep命令 - 查找的两种方式

3、grep命令示例:

4、grep命令练习: 

练习:

题目1:使用ps命令查看进程(pid=101420)的启动时间

题目2:查找哪些ip地址远程连接过来了(netstat 查看端口) ?

题目3:时间的正则(nginx日志)(找规律,共性的特点)

题目4:截取的根目录所占整个文件系统磁盘的比例大小(已用容量)

IP地址的正则表达式:

查找A类ip地址的正则    1~126.0~255.0~255.0~255    1-9    10-99    100-119    120-126

B类:第1个部分范围128~191    练习:写一个B类ip地址的正则    128~191.0~255.0~255.0~255    128-129    130-189    190-191

三、awk命令

1、什么是awk命令,它的选项有哪些,它在文本处理中起什么作用呢?

常用的awk命令选项包括:

2、awk分隔符:

 /etc/passwd文件中的每一行表示什么意思呢?

 使用awk截取passwd文件的用户名以及密码

3、awk命令的操作命令(BEGIN、END、NF、NR)

练习1:计算/etc/passwd里面第一个字段包含a字母的有多少个

4、awk的for循环

awk数组的使用

练习2: 游戏充值累加求和(升序,降序)

练习3:对IP地址下载量累加求和

练习4:求出nginx日志中的一些数:(1、计算每分钟的带宽:2、统计每个URL(即不带问号?后面的内容)的每分钟的频率 3、统计每个state的状态)

5、awk练习:

6、awk中一些常用函数的运用

1、split 分割

2、substr 截取

注:传递参数进入的时候需要进行转义“\”

四、sed命令

1、什么是sed命令,它的选项有哪些,它在文本处理中起什么作用呢?

sed可以实现的功能:

sed命令的常用选项和常见命令:

2、sed命令的使用:

1、sed的文本的过滤查找

2、文本的替换功能

3、通过sed替换修改selinux的配置文件,将selinux关闭

4、读取test_big_file.txt文件100-200行的内容

5、读取test_big_file.txt 第二行开始以后的三行(一共四行)

6、读取hehaotian.txt内的行,间隔一行读取一行(步长为2)

7、sed使用 变量 读取test_big_file.txt 的行数

8、sed可以根据字符串进行时间段的匹配

9、对hehaotian.txt文件进行sed替换操作(可以改变一行中替换的个数)

10、sed标签的使用

3、sed练习:


文本处理三剑客: 

    1、grep/egrep     查找(文本过滤)

    2、awk        截取

    3、sed        替换

一、正则表达式:

什么是正则表达式,它有什么作用?

正则表达式 regular expression(regexp)是一种用来描述、匹配和处理文本的字符串模式。它通常用于搜索、替换和验证文本数据。正则表达式由普通字符(例如字母、数字、标点符号等)和特殊字符(元字符)组成。元字符具有特殊的含义,可以用来表示一个或多个字符。

使用一些特殊符号+字母和数字按照某个规则组合成一个公式用来表示某个意思这就叫正则表达式
正则表达式   --》一种方法

正则表达式可以用于各种编程语言和工具中,包括JavaScript、Python、Java、Perl等等。在JavaScript中,使用RegExp对象来表示正则表达式,并提供了一组方法来进行模式匹配、替换等操作。

很多命令都支持或者使用这种方法
如:vim
       grep
       sed
       awk

正则表达式:

1.基本正则表达式(包括元字符的个数是有限的)
        ^ $  +

2.扩展正则表达式
        ? {4,6}  |    

正则表达式的元字符有哪些:

元字符:有特殊含义的字符,可以表示其他的含义。

^  代表以什么开头   ^root
$  代表以什么结尾   /$
+  代表前面的字符可以出现1次或者N次    a+  -->a  aa  aaa aaaaaaaaaaaa
|  代表逻辑“或”操作                --》“cat|dog”表示匹配包含“cat”或“dog”的字符串
?  代表前面的字符可以出现0或者1次        a?  -->a 
*  代表前面的字符可以出现0次或者N次    
.  代表单个任意字符
.* 代表所有的字符
^$ 代表空行
[0-9]  代表所有的数字
[0-Z]  代表所有的数字和字母
()    表示一个字符集合

grep中的-E选项解释:

-E, --extended-regexp
              Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.) (表示grep需要接 -E 才能使用正则表达式)

PATTERN 模式:
        包含了正则表达式的字符串
        "sc[0-9]+feng+de$"  --->这就是模式

二、grep命令

什么是grep命令,它的选项有哪些,它在文本处理中起什么作用呢?

grep是一种在Linux和Unix操作系统中常用的文本搜索工具,它可以在一个或多个文件中搜索指定的文本模式,并将匹配的行打印出来。grep的名字来源于“Global Regular Expression Print”,意为“全局正则表达式打印”。

1、grep命令的基本语法与常用选项:

grep命令的基本语法为:

grep [options] pattern [file ...]

其中,pattern表示要搜索的文本模式,file表示要搜索的文件名。如果省略file,则表示从标准输入中读取数据进行搜索。
grep命令常用的选项包括:

-i:忽略大小写进行搜索。

-v:反向搜索,只打印不匹配的行。

-o:仅仅输出匹配符合要求的项。

-A:打印符合要求的后几行。(如A3 表示符合要求的行的后三行)

-B:打印符合要求的前几行。

-C:打印符合要求的前后几行。

-n:打印匹配的行号。

-E:表示对扩展正则的支持    == egrep

-l:只打印匹配的文件名。

-c:只打印匹配的行数。

-r:递归搜索指定目录下的文件。

-w:只匹配整个单词,而不是单词的一部分。

-e:指定多个模式,用逗号分隔。

-f:从文件中读取模式进行搜索。

--include:只搜索指定类型的文件。

--exclude:排除指定类型的文件。

--exclude-dir:排除指定目录。

\s:表示空白(空格和tab)
等等。
grep命令还支持一些高级的正则表达式语法,例如使用“()”分组、使用“|”进行逻辑“或”操作、使用“{}”表示数量等。grep命令可以方便地进行文本搜索和数据处理,是Linux和Unix系统中不可或缺的工具之一。
 

2、grep命令 - 查找的两种方式

#查找的两种方式:
[root@mysql /]# grep "root" /etc/passwd    --》直接查找
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@mysql /]# cat /etc/passwd|grep "root"        --》通过管道符号传输查找
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@mysql /]# 

3、grep命令示例:

实验前提:

[root@mysql /]# mkdir lianxi   #创建lianxi文件夹
[root@mysql /]# cd lianxi/
[root@mysql lianxi]# ls
[root@mysql lianxi]# cp /etc/ssh/sshd_config .  #将sshd_config文件放到lianxi文件夹下
[root@mysql lianxi]# cp /etc/passwd .        #与上面同理
[root@mysql lianxi]# ls 
passwd  sshd_config
[root@mysql lianxi]# 

 我们将查找etc目录下所有的文件内的 'wuhao'

[root@mysql lianxi]# grep "wuhao" -n -r /etc/	--》查找etc目录下所有文件内的wuhao 并输出行号
/etc/group:42:wuhao:x:1003:
/etc/group:43:wuhao123:x:1004:
/etc/gshadow:42:wuhao:!::
/etc/gshadow:43:wuhao123:!::
/etc/passwd-:23:wuhao:x:1003:1003::/home/wuhao:/bin/bash
/etc/passwd-:24:wuhao123:x:1004:1004::/home/wuhao123:/bin/bash
/etc/shadow-:23:wuhao:!!:19430:0:99999:7:::
/etc/shadow-:24:wuhao123:!!:19430:0:99999:7:::
/etc/passwd:23:wuhao:x:1003:1003::/home/wuhao:/bin/bash
/etc/passwd:24:wuhao123:x:1004:1004::/home/wuhao123:/bin/bash
/etc/shadow:23:wuhao:!!:19430:0:99999:7:::
/etc/shadow:24:wuhao123:!!:19430:0:99999:7:::
/etc/subgid:4:wuhao:296608:65536
/etc/subgid:5:wuhao123:362144:65536
/etc/subuid:4:wuhao:296608:65536
/etc/subuid:5:wuhao123:362144:65536
/etc/gshadow-:42:wuhao:!::
/etc/gshadow-:43:wuhao123:!::
/etc/group-:42:wuhao:x:1003:
/etc/group-:43:wuhao123:x:1004:
/etc/subuid-:4:wuhao:296608:65536
/etc/subuid-:5:wuhao123:362144:65536
/etc/subgid-:4:wuhao:296608:65536
/etc/subgid-:5:wuhao123:362144:65536
[root@mysql lianxi]# 

 查找本目录下passwd文件中存在的 wuhao 或者 liquan 字符串的行,并输出到屏幕上

[root@mysql lianxi]# grep "wuhao|liquan" passwd    		
[root@mysql lianxi]# grep -E "wuhao|liquan" passwd     --》对扩展正则的支持 或者 直接使用egrep
wuhao:x:1003:1003::/home/wuhao:/bin/bash
wuhao123:x:1004:1004::/home/wuhao123:/bin/bash
liquan:x:1006:1006::/home/liquan:/bin/bash
[root@mysql lianxi]# 
[root@mysql lianxi]# grep "wuhao\|liquan" passwd 		--》对 | 符号进行转义
wuhao:x:1003:1003::/home/wuhao:/bin/bash
wuhao123:x:1004:1004::/home/wuhao123:/bin/bash
liquan:x:1006:1006::/home/liquan:/bin/bash
[root@mysql lianxi]# 
[root@mysql lianxi]# egrep "wuhao|liquan" passwd 		--》 egrep也可以使用
wuhao:x:1003:1003::/home/wuhao:/bin/bash
wuhao123:x:1004:1004::/home/wuhao123:/bin/bash
liquan:x:1006:1006::/home/liquan:/bin/bash
[root@mysql lianxi]# 

 grep中单词的定界符号:(\<...\> 或者 \b...b\)(用于选取准确的字符串)

单词的定界符号: 
[root@web1 lianxi]# cat sc.txt 
liquan123   liquanabc    fengliquan   zhangliquan123
liquan
xiaoliquan
xiaoliquanliu
[root@web1 lianxi]# cat sc.txt |egrep "\<liquan"		--》单词以liquan开头
liquan123   liquanabc    fengliquan   zhangliquan123
liquan
[root@web1 lianxi]# cat sc.txt |egrep "\<liquan\>"		--》单词以liquan开头和结尾
liquan
[root@web1 lianxi]# cat sc.txt |egrep "liquan\>"		--》单词以liquan结尾
liquan123   liquanabc    fengliquan   zhangliquan123
liquan
xiaoliquan
[root@web1 lianxi]# cat sc.txt |egrep "liquan\b"		--》跟上面一样的意思		
liquan123   liquanabc    fengliquan   zhangliquan123
liquan
xiaoliquan
[root@web1 lianxi]# cat sc.txt |egrep "\bliquan"
liquan123   liquanabc    fengliquan   zhangliquan123
liquan
[root@web1 lianxi]# cat sc.txt |egrep "\bliquan\b"
liquan
[root@web1 lianxi]# 

4、grep命令练习: 

练习:

练习:
1.进入/lianxi目录,复制/etc/passwd到当前目录下,然后对passwd进行操作
[root@mysql lianxi]# cp /etc/passwd .

2、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
[root@mysql lianxi]# cat passwd |egrep "^ftp|^mail"

3、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。
[root@mysql lianxi]# cat passwd |egrep -v "^r|^m|^f"
[root@mysql lianxi]# egrep -v "^[rmf]" passwd

4、查找出当前passwd文件中以bash结尾的行。
[root@mysql lianxi]# cat passwd |egrep  "bash$"

5、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
[root@mysql lianxi]# cat /etc/login.defs |egrep -v "^#|^$"

6、查找出/var/log/messages文档中有14个字母的单词?
egrep "\b[a-Z]{14}\b" /var/log/messages
[root@mysql lianxi]# cat /var/log/messages| egrep "\<[a-Z]{14}\>"

7、查找出来/etc/passwd文件里用户名包含liu同时使用bash的用户
 egrep  ".*liu.*:x.*bash$" /etc/passwd
[root@mysql lianxi]# cat /etc/passwd |egrep ".*liu.*:x.*bash$"  -->.*liu.*:x 可以将他为用户名写死
liucheng:x:1007:1007::/home/liucheng:/bin/bash

8、查找/etc/ssh/sshd_config 里的有效行
egrep -n -v "^$|^#" /etc/ssh/sshd_config 

9、查找出/etc/ssh/sshd_config 文件里的包含连续2个数字的行
egrep "\<[0-9]{2}\>" /etc/ssh/sshd_config 			--》表示只包含2个数字的行
[root@mysql lianxi]# cat sshd_config |egrep "\<[0-9]{2}\>"

10、查找出/etc/ssh/sshd_config 包含特殊字符的行
[root@web1 lianxi]# egrep -o  "[^0-Z]" /etc/ssh/sshd_config |sort|uniq  -->|sort|uniq  排序 去重
[root@mysql lianxi]# cat /etc/ssh/sshd_config |egrep -n -o "[^0-Z]" 

11、查找出/etc/ssh/sshd_config 不包含数字的行
egrep -v  "[0-9]" /etc/ssh/sshd_config 

12、查找出/var/log/secure里的ip地址出来
[root@mysql lianxi]# cat /var/log/secure |egrep -o "([0-9]{1,3}\.){3}[0-9]"   --》表示有三项 数字加点(123.) 然后再加一个数字的表示

13.查找出/etc/ssh/sshd_config里包含port字符串的行和后5行的内容
egrep -A5 "port" /etc/ssh/sshd_config 

14、写一个表示下面网址的正则表达式出来。例如:
	vim web.txt 内容如下:
	http://www.baidu.com
	http://www.sina.com
	https://www.163.com
	http://www.12306.cn
	http://www.qillu.edu
	rsync://www.github.com/abc
	ftp://192.168.0.1
	ftp://www.baidu.com
	(ctrl + v 可视化模式)
	协议://字符串.字符串.字符串
cat web.txt |egrep  "(http|https|ftp|rsync)://[0-Z]+\.[0-Z]+\.[0-Z]+.*"

[root@mysql lianxi]# cat web.txt|egrep "(http|https|rsync|ftp)://([0-Z]{1,10}\.){2}+[0-Z]+.*"

写正则的过程就是总结出共性的特点


要求你了解正常的网站的地址
15、写一个表示邮箱的正则
	vim  mail.txt 内容如下:
	feng@qq.com
	1234feng@163.com
	meng.xianhui@yahoo.cn
	liudehua@sina.com
	10001@qq.com
	123_ui@12306.cn
	fengdeyong 123
	qilu@qilu.edu
	qilu@qilu.edu/fjdkfjk/fjdk

	需要你了解正常的邮箱的格式
	字符串@字符串.字符串
	[0-Z_]+@[0-Z]+\.[0-Z]+
cat mail.txt |egrep -o "[0-Z_]+@[0-Z]+\.[0-Z]+"
[root@mysql lianxi]# cat mail.txt | egrep "[0-Z_.]+@[0-Z]+\.[0-Z]+.*"  -->[0-Z_.] 表示可取的范围为0到Z之间,再加上下划线_和点.

写正则表达式其实就是总结出ip、 邮箱、 网址等内容的规律来

题目1:使用ps命令查看进程(pid=101420)的启动时间

[root@mysql lianxi]# ps aux|egrep "\<101420\>"			
root     101420  0.0  0.2 115676  2176 pts/0    Ss   3月14   0:00 -bash
root     105563  0.0  0.1 112824  1008 pts/0    R+   00:17   0:00 grep -E --color=auto \<101420\>
[root@mysql lianxi]# ps aux|egrep "\<101420\>"|awk '{print $9}'   方法一:使用grep的查找和awk的截取命令
3月14
00:20
[root@mysql lianxi]# 

[root@mysql lianxi]# ps aux|awk '$2~/101420/{print $9}'   方法二:直接使用awk的查找和截取命令
3月14
[root@mysql lianxi]# 

题目2:查找哪些ip地址远程连接过来了(netstat 查看端口) ?

[root@web1 lianxi]# yum install net-tools -y			--》 下载了netstat命令

[root@web1 lianxi]# netstat -anplut   			--> 查看本机开发了哪些端口,哪些人远程连接过来了
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1184/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1114/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1614/master         
tcp        0    232 192.168.2.205:22        192.168.2.126:62097     ESTABLISHED 9147/sshd: root@pts 
tcp        0      0 192.168.2.205:22        192.168.2.126:62065     ESTABLISHED 9121/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      1114/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1614/master         
udp        0      0 127.0.0.1:323           0.0.0.0:*                           781/chronyd         
udp6       0      0 ::1:323                 :::*                                781/chronyd         
[root@web1 lianxi]# 

[root@mysql lianxi]# netstat -anpult|egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"			--> 查找所有类型的ip地址
0.0.0.0
0.0.0.0
0.0.0.0
0.0.0.0
127.0.0.1
0.0.0.0
172.20.10.3
202.141.160.110
172.20.10.3
172.20.10.2
127.0.0.1
0.0.0.0
[root@mysql lianxi]# netstat -anpult|egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" |sort|uniq			--》给ip地址排序和去重
0.0.0.0
127.0.0.1
172.20.10.2
172.20.10.3
202.141.160.110
[root@mysql lianxi]# 

题目3:时间的正则(nginx日志)(找规律,共性的特点)

2019-04-25T09:56:58+08:00|f.google.com|210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|-
2019-04-25T09:57:58+08:00|g.google.com|47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4

2019-04-25T09:56里每秒钟
2019-04-25T09:56:0~59
2019-04-25T09:56:([0-9]|[1-5][0-9])

2019-04-25T09:56
09点里的每分钟
2019-04-25T09:0~59
2019-04-25T09:([0-9]|[1-5][0-9])

2019-04-25T09:57:55+08:00  80
2019-04-25T09:57:58+08:00  20
2019-04-25T09:57:59+08:00  50


2019-04-25T09:58:55+08:00  800
2019-04-25T09:58:58+08:00  20
2019-04-25T09:58:59+08:00  50

2019-04-25T09:59:55+08:00  800
2019-04-25T09:59:58+08:00  20
2019-04-25T09:59:59+08:00  50
=====

题目4:截取的根目录所占整个文件系统磁盘的比例大小(已用容量)


[root@web1 lianxi]# df -Th|grep "/$"|awk '{print $6}'
41%
[root@web1 lianxi]# df -Th|grep "/$"|awk '{print $((NF-1))}'
41%
[root@web1 lianxi]# df -Th|grep "/$"|awk '{print $((NF-1))}'|tr -d "%"
41
[root@web1 lianxi]# num=$(df -Th|grep "/$"|awk '{print $((NF-1))}'|tr -d "%")
[root@web1 lianxi]# echo $num
41
[root@web1 lianxi]#
 
第二次练习
[root@service /]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     487M     0  487M   0% /dev/shm
tmpfs          tmpfs     487M   15M  472M   4% /run
tmpfs          tmpfs     487M     0  487M   0% /sys/fs/cgroup
/dev/sda3      xfs        18G  6.9G   11G  39% /					--》 截取 39%
/dev/sda1      xfs       297M  152M  145M  52% /boot
tmpfs          tmpfs      98M   44K   98M   1% /run/user/1000
tmpfs          tmpfs      98M     0   98M   0% /run/user/0
[root@service /]# df -Th|egrep "/$"
/dev/sda3      xfs        18G  6.9G   11G  39% /
[root@service /]# df -Th|egrep "/$"|tr -s " "
/dev/sda3 xfs 18G 6.9G 11G 39% /
[root@service /]# df -Th|egrep "/$"|tr -s " "|cut -d " " -f 6
39%
[root@service /]# 
[root@service /]# df -Th|egrep "/$"|awk '{print $6}'
39%
[root@service /]# 
[root@service /]# df -Th|awk '/\/$/{print $6}'
39%

IP地址的正则表达式:

IP地址由32位二进制数构成,通常以四个8位二进制数表示,每个8位二进制数用十进制数表示,中间用句点分隔开
IPv4:  由4个部分组成
            192.168.12.123

            A:第1个部分范围1~126
            B:第1个部分范围128~191
            C:第1个部分范围192~223

            其他部分: 0~255

我们需要写查找A类ip地址的正则
1~126.0~255.0~255.0~255

只是ip地址
    0~255
如果我们先写4段 0~999的正则
    0~999.0~999.0~999.0~999
    1位数字  1-9
    2位数字  10~99
    3位数字  100~999

cat /var/log/secure |egrep -o "(([1-9]|[1-9][0-9]|[1-9][0-9][0-9])\.){3}([1-9]|[1-9][0-9]|[1-9][0-9][0-9])""
                 解释:                    (( 1-9 |   10-99  |   100-999 )  +.  ) x 3       +        0~999

    

cat /var/log/secure |egrep -o "([0-9]{1,3}\.){3}[0-9]"

          表达:                     0~255.0~255.0~255.0~255
    1位数字  0-9
    2位数字  10~99
    3位数字  100~255
            100~199
            200~249
            250~255
    (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])

表示(( 0-9 |   10-99  | 100-199 |  200-249  |250-255)+.) x 3      +      0~255 
 

 按照上面的逻辑,写的如下代码:

[root@web1 log]# cat secure|egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
Mar 19 10:07:52 web1 sshd[8387]: Accepted password for root from 192.168.2.126 port 63162 ssh2
Mar 19 14:40:19 web1 sshd[8742]: Accepted password for root from 192.168.2.126 port 62037 ssh2
Mar 19 14:41:37 web1 sshd[9121]: Accepted password for root from 192.168.2.126 port 62065 ssh2
Mar 19 14:43:16 web1 sshd[9147]: Accepted password for root from 192.168.2.126 port 62097 ssh2
[root@web1 log]# 

查找A类ip地址的正则
    1~126.0~255.0~255.0~255
    1-9
    10-99
    100-119
    120-126

正则:(([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-6]))(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}

[root@web1 lianxi]# egrep "\b([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}\b" web.txt 
12.13.24.5
[root@web1 lianxi]# 

B类:第1个部分范围128~191
    练习:写一个B类ip地址的正则
    128~191.0~255.0~255.0~255
    128-129
    130-189
    190-191

正则:(12[8-9]|1[3-8][0-9]|19[0-1])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}

[root@mysql lianxi]# egrep "\b(12[8-9]|1[3-8][0-9]|19[0-1])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}\b" web.txt 
128.123.123.123
168.232.113.1
[root@mysql lianxi]# 

三、awk命令

1、什么是awk命令,它的选项有哪些,它在文本处理中起什么作用呢?

awk是一种文本处理工具,它可以从文件或标准输入中逐行读取文本,并对每行文本进行指定操作。awk的基本语法是:awk 'pattern {action}' file,其中pattern是一个正则表达式,用于匹配文本行,action是一个或多个操作,用于对匹配到的文本行进行处理。

awk命令可以用于以下场景:

提取文本中的指定字段或行:使用awk命令可以按照指定的分隔符或正则表达式提取文本中的指定字段或行。

对文本进行格式化输出:使用awk命令可以对文本进行格式化输出,例如对齐、补齐、转换等操作。

统计文本中的数据:使用awk命令可以对文本中的数据进行统计,例如求和、平均值、最大值、最小值等操作。

处理文本中的特定模式:使用awk命令可以对文本中的特定模式进行处理,例如匹配URL、IP地址、日期等。

常用的awk命令选项包括:

常用的awk命令选项包括:

-F,指定字段分隔符,默认为制表符。

-v,定义一个变量并赋值。

-f,从指定文件中读取awk命令。

-i,原地修改文件。

-o,指定输出分隔符。

-v,定义一个变量并赋值。

-v,定义一个变量并赋值。
例如,以下命令将统计文件中第2列的总和:

awk '{sum += $2} END {print sum}' file.txt

该命令使用awk读取file.txt文件,对每行文本进行处理,将第2列的值累加到变量sum中,最后输出sum的值。

2、awk分隔符:

1.输入分隔符
    默认是空白(空格和tab)
    -F  选项:指定输入分隔符
    FS   输入分隔符的变量

       FS          The input field separator, a space by default.  See Fields, above.

2.输出分隔符
    默认是一个空格
    OFS 指定输出分隔符  输出分隔符的变量
  OFS         The output field separator, a space by default.

 /etc/passwd文件中的每一行表示什么意思呢?

/etc/passwd文件中的每一行表示一个用户账号的信息,包括以下七个字段,每个字段之间由冒号(:)分隔:

  1. 用户名:用于登录的用户名,必须是唯一的。
  2. 密码:用户的密码,保存在加密形式下,通常以“x”表示。
  3. 用户ID(UID):每个用户都有一个唯一的UID,用于标识用户,0为超级管理员。
  4. 组ID(GID):用户所属的主组的ID。
  5. 用户信息(GECOS):包含用户的全名、电话号码等信息。
  6. 家目录:用户登录后的默认工作目录。
  7. 登录Shell:用户登录后默认使用的Shell程序。

 使用awk截取passwd文件的用户名以及密码

[root@service /]# awk -F ":" '{print $1,$2}' /etc/passwd|head -n 10 --》$1,$2中 逗号是调用输出分割符(默认是空格)head -n 10 表示只读取10行
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
[root@service /]# 
[root@service /]# awk -F ":" '{print $1 $2}' /etc/passwd|head -n 10  --》 ":" 表达的是输入分隔符
rootx
binx
daemonx
admx
lpx
syncx
shutdownx
haltx
mailx
operatorx
[root@service /]# 
[root@service /]# awk -F ":" '{print $1,$2,$0}' /etc/passwd|head -n 10  --》读取10行、 $0表示整行输出
root x root:x:0:0:root:/root:/bin/bash
bin x bin:x:1:1:bin:/bin:/sbin/nologin
daemon x daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm x adm:x:3:4:adm:/var/adm:/sbin/nologin
lp x lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync x sync:x:5:0:sync:/sbin:/bin/sync
shutdown x shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt x halt:x:7:0:halt:/sbin:/sbin/halt
mail x mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator x operator:x:11:0:operator:/root:/sbin/nologin
[root@service /]# 

 awk一行里可以定义多个分隔符。

[root@service /]# cat /etc/passwd |tail -1|awk -F "[:/]"  '{print $8}'
liyanqing
[root@service /]# 
-F "[:/]"   --》 表示 : 和 / 都成为了输入分隔符

3、awk命令的操作命令(BEGIN、END、NF、NR)

[root@service /]# awk -F ":" 'BEGIN{num=0;print "开始处 理文件/etc/passwd"} $1~/feng/ || $3>1005 {print NR,NF,$1,length($1),$NF,$(NF-1),$3;num++} END{print "total:" num}' /etc/passwd
开始处理文件/etc/passwd
38 7 nfsnobody 9 /sbin/nologin /var/lib/nfs 65534
48 7 caocao 6 /bin/bash /anhui/bozhou 8898
49 7 liyanqing 9 /sbin/nologin /home/liyanqing 8899
total:3
[root@service /]# 

$1~/feng/ --》 表示在feng 包含(~) 在第一个字段里面
BEGIN --》 只在文件开头运行一次
END	  --》 只在文件结尾运行一次
NF          The number of fields in the current input record.   一行里有多少个字段(列)
NR          The total number of input records seen so far.  行号
$NF 最后一个字段  
length($1) 表达 $1 字段的长度

练习1:计算/etc/passwd里面第一个字段包含a字母的有多少个

计算/etc/passwd里面第一个字段包含a字母的有多少个
[root@service /]# cat /etc/passwd | awk -F ":" 'BEGIN{num=0;print "开始计数"}$1~/a/{print $1;num++}END{print "sum="num}'
或者:[root@service /]# cat /etc/passwd | awk -F ":" '$1~/a/{print $1;num++}END{print "sum="num}'

开始计数
daemon
adm
halt
mail
operator
games
libstoragemgmt
saned
saslauth
abrt
radvd
gnome-initial-setup
avahi
clay666
caocao
liyanqing
sum=16
[root@service /]# 

4、awk的for循环

awk数组的使用

awk的数组

[root@service /]# cat /etc/passwd|awk -F ":" '{user[$1]=$3;print $1,user[$1]}'|head
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
[root@service /]# 

[root@service /]# cat /etc/passwd|awk -F ":" '{user[$1]=$3}END{for(i in user) print i,user[i]}'|head
adm 3
rpc 32
radvd 75
sync 5
mail 8
clay666 1000
tss 59
mysql 27
gluster 995
unbound 991
[root@service /]# 

练习2: 游戏充值累加求和(升序,降序)

练习: 游戏充值累加求和
[root@service lianxi]# cat bill.txt 
username    money
feng    100
feng    200
feng    350
li    200
li    239
li    890
zhang  100
zhang   350
feng	8000
li	10000
[root@service lianxi]# 

[root@service lianxi]# cat bill.txt |awk 'NR>1{game[$1]+=$2}END{for(i in game) print i,game[i]}'
li 11329
feng 8650
zhang 450
[root@service lianxi]# 

升序:
[root@service lianxi]# cat bill.txt |awk 'NR>1{game[$1]+=$2}END{for(i in game) print i,game[i]}' |sort -n -k 2  --》升序
zhang 450
li 11329
feng 3008649
降序:
[root@service lianxi]# cat bill.txt |awk 'NR>1{game[$1]+=$2}END{for(i in game) print i,game[i]}' |sort -nr -k 2  --》降序
feng 3008649
li 11329
zhang 450
[root@service lianxi]# 

练习3:对IP地址下载量累加求和

[root@service lianxi]# cat ip.txt 
172.16.130.26 16274.7
172.16.20.126 8783.61
172.16.130.33 5876.59
172.16.130.33 5876.59
172.16.13.145 5389.23
172.16.130.26 16274.7
172.16.130.26 16274.7
172.16.145.173 4974.36
172.16.130.33 5876.59
[root@service lianxi]# 


[root@service lianxi]# cat ip.txt |awk '{ip[$1]+=$2}END{for(i in ip) print i,ip[i]}'
172.16.130.33 17629.8
172.16.13.145 5389.23
172.16.20.126 8783.61
172.16.130.26 48824.1
172.16.145.173 4974.36
[root@service lianxi]# 

[root@service lianxi]# yum install net-tools -y
使用ifconfig 查看流量并且截取流量 求和
yum   install  net-tools -y
ifcofnig

练习4:求出nginx日志中的一些数:(1、计算每分钟的带宽:2、统计每个URL(即不带问号?后面的内容)的每分钟的频率 3、统计每个state的状态)

求出日志中的一些数:
nginx 日志
$time_iso8601|$host|$http_cf_connecting_ip|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent
-------------------------------------
2019-04-25T09:51:58+08:00|a.google.com|47.52.197.27|GET /v2/depth?symbol=aaa HTTP/1.1|200|24|-|apple
2019-04-25T09:52:58+08:00|b.google.com|47.75.159.123|GET /v2/depth?symbol=bbb HTTP/1.1|200|407|-|python-requests/2.20.0
2019-04-25T09:53:58+08:00|c.google.com|13.125.219.4|GET /v2/ticker?timestamp=1556157118&symbol=ccc HTTP/1.1|200|162|-|chrome
2019-04-25T09:54:58+08:00|d.shuzibi.co|-||HEAD /justfor.txt HTTP/1.0|200|0|-|-
2019-04-25T09:55:58+08:00|e.google.com|13.251.98.2|GET /v2/order_detail?apiKey=ddd HTTP/1.1|200|231|-|python-requests/2.18.4
2019-04-25T09:56:58+08:00|f.google.com|210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|-
2019-04-25T09:57:58+08:00|g.google.com|47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4
2019-04-25T09:58:58+08:00|h.google.com|47.75.58.56|GET /v2/depth?symbol=ggg HTTP/1.1|200|404|-|safari
2019-04-25T09:59:58+08:00|i.google.com|188.40.137.175|GET /v2/trade_detail?symbol=hhh HTTP/1.1|200|6644|-|-
2019-04-25T10:01:58+08:00|j.google.com|2600:3c01:0:0:f03c:91ff:fe60:49b8|GET /v2/myposition?apiKey=jjj HTTP/1.1|200|110|-|scan

1、计算每分钟的带宽:
[root@service lianxi]# cat nginx.log |awk -F '|' 'NR>2 {network[substr($1,1,16)]+=$6} END{for (i in network) print i,network[i]}'
2019-04-25T10:01 110
2019-04-25T09:56 24
2019-04-25T09:57 397
2019-04-25T09:58 404
2019-04-25T09:59 6644
2019-04-25T09:51 24
2019-04-25T09:52 407
2019-04-25T09:53 162
2019-04-25T09:54 200
2019-04-25T09:55 231
[root@service lianxi]# 

2、统计每个URL(即不带问号?后面的内容)的每分钟的频率
方法一:拿url做key
[root@service lianxi]# cat nginx.log | awk -F '|' 'NR>2 {split($4,a,"?"); b[a[1]]+=1} END{for (i in b) print i,b[i]}'
GET /v2/trade_detail 2
GET /v2/ticker 2
GET /v2/order_detail 1
GET /v2/depth 4
GET /v2/myposition 1
[root@service lianxi]# 

方法二:拿两个一起做key
[root@service lianxi]# cat nginx.log | awk -F '[|? ]' 'NR>2 {network[substr($1,1,16) $5]+=1} END{for (i in network) print i,network[i]}'
2019-04-25T09:55/v2/order_detail 1
2019-04-25T10:01/v2/myposition 1
2019-04-25T09:59/v2/trade_detail 1
2019-04-25T09:53/v2/ticker 1
2019-04-25T09:54/v2/ticker 6
2019-04-25T09:58/v2/depth 1
2019-04-25T09:57/v2/depth 5
2019-04-25T09:52/v2/depth 1
2019-04-25T09:51/v2/depth 1
2019-04-25T09:56/v2/trade_detail 1
[root@service lianxi]# 

3、统计每个state的状态
netstat -anplut
  Proto Recv-Q Send-Q Local Address               Foreign Address             State
  tcp        0      0 172.16.18.227:38734         172.16.10.25:5921           ESTABLISHED 
  tcp        0      0 172.16.18.227:33046         172.16.17.83:5921           ESTABLISHED 
  tcp        0      0 127.0.0.1:38978             127.0.0.1:12321             TIME_WAIT   
  tcp        0      0 127.0.0.1:38990             127.0.0.1:12321             TIME_WAIT     
  tcp        0      0 127.0.0.1:3306              127.0.0.1:35422             ESTABLISHED 
  tcp        0      0 127.0.0.1:38912             127.0.0.1:12321             TIME_WAIT  

以ESTABLISHED为key 进行自增
[root@claylpf lianxi]# cat state.txt | awk 'NR>1 {s[$6]+=1} END{for (i in s) print i,s[i]}'
ESTABLISHED 3
TIME_WAIT 3
[root@claylpf lianxi]# 

5、awk练习:

练习:

1、使用NF变量显示passwd文件倒数第二列的内容
[root@mysql lianxi]# awk -F: '{print $(NF-1)}' /etc/passwd

2、显示passwd文件中第5到第10行的用户名
[root@mysql lianxi]# awk -F: 'NR>=5&&NR<=10 {print NR,$1}' passwd
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 operator


3、显示passwd文件中第7列不是bash的用户名
[root@mysql lianxi]# awk -F: '$7!~/bash/ {print $1}' passwd

4、显示passwd文件中行号是5结尾的行号和行
[root@mysql lianxi]# awk -F: 'NR~/5$/ {print NR,$1}' passwd
5 lp
15 dbus
25 WUHAO456
[root@mysql lianxi]# 

5、ip add只显示ip(不能使用tr或者cut命令)
[root@mysql lianxi]# ip add|awk '/inet.*ens33$/{print $2}'
172.20.10.3/24

6、使用awk显示ens33的入站流量和出站流量(字节)
[root@mysql lianxi]# ifconfig ens33|awk '/RX p|TX p/ {print $5}'
262051190
1013247267
[root@mysql lianxi]# 


7、使用awk命令统计以r开头的用户数目,显示如下效果
[root@mysql lianxi]# awk -F : 'BEGIN{num=0;print "开始计数!"} /^r/ {print $1;num++} END{print "用户以r开头的有" num}' passwd
开始计数!
root
用户以r开头的有1
[root@mysql lianxi]# 

8、统计出三人的累计消费量、按照金额大小排序
[root@mysql lianxi]# cat name.txt 
feng 100
feng 200
feng 350
li 200
li 239
li 890
zhang 100
zhang 350
[root@mysql lianxi]# cat name.txt | awk '{name[$1]+=$2} END{for(i in name) print i,name[i]}' |sort -k2 -nr
li 1329
feng 650
zhang 450
[root@mysql lianxi]# 

6、awk中一些常用函数的运用

1、split 分割

[root@mysql lianxi]# ip add|awk '/inet.*ens[0-9]+$/ {print $2}'
172.20.10.3/24

[root@mysql lianxi]# ip add|awk '/inet.*ens[0-9]+$/ {split($2,a,"/");print a[1]}' --》split是将$2分割(分割符号为/ )成两个存到a数组中,之后使用print输出
172.20.10.3
[root@mysql lianxi]# ip add|awk '/inet.*ens[0-9]+$/ {split($2,a,"/");print a[2]}'
24
[root@mysql lianxi]# 

2、substr 截取

substr(s, i [, n])      Return  the  at  most  n-character  substring of s starting at i.  If n is
                               omitted, use the rest of s.
s是我们的字符串
i是从第i个字符开始
n表示截取的字符串的长度
substr($1,1,4) 从第1个字符开始,连续截取4个字符

substr($1,3,5)  从第3个字符开始,连续截取5个字符

[root@mysql lianxi]# cat passwd | awk '{print substr($1,1,2)}'|tail
ss
po
........

注:传递参数进入的时候需要进行转义“\”

[root@service lianxi]# city=changsha
[root@service lianxi]# useradd changsha1
[root@service lianxi]# useradd changsha2
[root@service lianxi]# awk -F: "/^$city/" /etc/passwd   -->传递参数
changsha1:x:8900:8901::/home/changsha1:/bin/bash
changsha2:x:8901:8902::/home/changsha2:/bin/bash
[root@service lianxi]# awk -F: "/^$city/ {print \$1,\$3}" /etc/passwd   -->传递参数进入的时候需要进行转义“\”
changsha1 8900
changsha2 8901
[root@service lianxi]# 

四、sed命令

1、什么是sed命令,它的选项有哪些,它在文本处理中起什么作用呢?

sed命令是一种流编辑器,用于对文本进行处理和转换。它可以读取文本文件并对其进行编辑、替换、删除、插入等操作,可以实现批量修改文件内容的功能。

sed是一种支持正则表达式的非交互式流编辑器(stream editor),是脚本中修改文本或者文本替换的最佳工具。

sed可以实现的功能:

sed命令在文本处理中起到了非常重要的作用,可以用它来实现以下功能:

  • 替换文本中的某些字符或字符串;
  • 删除文本中的某些行或字符;
  • 在文本中插入新的内容;
  • 对文本进行格式化等操作。

sed命令的常用选项和常见命令:

sed命令的常用选项包括:

  •  -n:该选项表示sed命令只输出经过编辑的文本行,不输出未编辑的文本行。

  •  -e:该选项表示sed命令可以接受多个编辑命令,指定要执行的sed命令;

  •  -i :该选项表示sed命令直接修改原始文件而不是输出到标准输出流。

  •  -s:该选项表示sed命令可以将多个空格或制表符替换为单个空格。

  •  -r:该选项表示sed命令使用扩展正则表达式

  • 以上是一些常见的sed命令选项,还有其他选项和命令可以在man sed命令中查看。

以下是一些常见的sed命令:

    1、替换操作:s/old/new/g
    这个命令用于替换文件中所有的old字符串为new字符串。
    g选项表示全局替换,如果不加g,则只替换每行中第一个匹配的字符串。

    2、删除操作:d
    这个命令用于删除匹配的行。例如,要删除文件中所有包含“apple”的行,可以使用以下命令:

    sed '/apple/d' filename

    3、插入操作:i
    这个命令用于在匹配的行之前插入一行文本。例如,要在文件中所有包含“banana”的行之前插入一行“fruit”的文本,可以使用以下命令:

    sed '/banana/i\fruit' filename

    4、追加操作:a
    这个命令用于在匹配的行之后追加一行文本。例如,要在文件中所有包含“orange”的行之后追加一行“fruit”的文本,可以使用以下命令:

    sed '/orange/a\fruit' filename

    5、打印操作:p
    这个命令用于打印匹配的行。例如,要打印文件中所有包含“pear”的行,可以使用以下命令:

    sed -n '/pear/p' filename

    6、替换行:c
    这个命令用于替换匹配的行。例如,要替换文件中所有包含“grape”的行为“fruit”的文本,可以使用以下命令:

    sed '/grape/c\fruit' filename

    7、转换字符:y
    这个命令用于将字符集中的字符替换为另一个字符集中的字符。例如,要将文件中所有的小写字母替换为大写字母,可以使用以下命令:

    sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' filename

2、sed命令的使用:

1、sed的文本的过滤查找

[root@service lianxi]# sed -n '/logyi/ p' hehaotian.txt   --》查找hehaotian.txt内的logyi的行

-n  不符合要求的行,不要显示出现
           -n, --quiet, --silent

                  suppress automatic printing of pattern space

                  pattern space 模式空间
                  hold  space 保留空间

p  是sed内部的命令  输出内容到屏幕  print

        /longyi/ p查找到包含字符串longyi的行,然后显示出来 --》默认是整行输出

2、文本的替换功能

[root@service lianxi]# sed -i 's/pan/zhang/' hehaotian.txt  --》将文本中的pan替换为zhang

-i   直接在原文件里进行修改  
        -i[SUFFIX], --in-place[=SUFFIX]  给原文件先进行备份,备份的文件名后面加一个后缀名

                  edit files in place (makes backup if SUFFIX supplied)
    加后缀名.bak
    [root@docker lianxi]# sed  -i.bak  's/cao/liu/' hehaotian.txt    --》是给hehaotian.txt进行备份 然后再修改


    [root@docker lianxi]# ls
    hehaotian.txt  hehaotian.txt.bak  

    s/pan/zhang/   使用zhang去替换pan  s是替换命令  substitute

3、通过sed替换修改selinux的配置文件,将selinux关闭

[root@docker lianxi]# sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
[root@docker lianxi]# cat /etc/selinux/config 

	# 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=disabled             --》disabled表示关闭selinux服务
	# SELINUXTYPE= can take one of three values:
	#     targeted - Targeted processes are protected,
	#     minimum - Modification of targeted policy. Only selected processes are protected. 
	#     mls - Multi Level Security protection.
	SELINUXTYPE=targeted 

[root@docker lianxi]# 

4、读取test_big_file.txt文件100-200行的内容

[root@docker lianxi]# sed -n '100,200p' test_big_file.txt 
[root@docker lianxi]# head -200 test_big_file.txt |tail -101

5、读取test_big_file.txt 第二行开始以后的三行(一共四行)

[root@docker lianxi]# sed -n '2,+3p' test_big_file.txt    --》读取第二行后的三行
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 2
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 3
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 4
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 5
[root@docker lianxi]#

6、读取hehaotian.txt内的行,间隔一行读取一行(步长为2)

[root@docker lianxi]# cat -n hehaotian.txt|sed -n '1~2p'  --》从第一行开始,隔一行读一行
     1	hehaotian   luqianjun zhanglinfeng  zhangyi
     3	hehaotian   luqianjun zhanglinfeng  zhangyi
     5	liujb  lipengfei
     7	liujb  lipengfei wuhao gaohui
[root@docker lianxi]# cat -n hehaotian.txt|sed -n '2~2p' 
     2	hehaotian   luqianjun zhanglinfeng  zhangyi
     4	hehaotian   luqianjun zhanglinfeng  zhangyi
     6	liujb  lipengfei wuhao
[root@docker lianxi]# 

7、sed使用 变量 读取test_big_file.txt 的行数

使用双引号,变量建议使用花括号括起来
[root@docker lianxi]# num1=10
[root@docker lianxi]# num2=20
[root@docker lianxi]# sed -n "${num1},${num2}p"  test_big_file.txt 
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 10
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 11
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 12
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 13
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 14
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 15
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 16
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 17
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 18
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 19
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 20
[root@docker lianxi]# 

因此sed 查找方式:
    1.根据行号
    2.根据模式-->正则表达式=字符+特殊符号
    3.根据字符串  -->根据日志的日期去查找

8、sed可以根据字符串进行时间段的匹配

sed 可以根据字符串进行时间段的匹配
Apr  2 14:23:36
Apr  2 15:01:01
sed   -n  '/Apr  2 14:23:36/,/Apr  2 15:01:01/ p' messages

9、对hehaotian.txt文件进行sed替换操作(可以改变一行中替换的个数)

[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/' hehaotian.txt  替换第一个hehaotian
[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/g' hehaotian.txt 替换所有的
[root@docker lianxi]# sed  -i  '/zhangyi/  s/liuna/hehaotian/2' hehaotian.txt  替换第2个
[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/2g' hehaotian.txt  从第2个开始替换

10、sed标签的使用

[root@docker lianxi]# echo  aaafdfd bbb ccc |sed -nr 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/p'
ccc bbb aaafdfd
[root@docker lianxi]# echo  aaafdfd bbb ccc |sed -nr 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/p'
ccc
[root@docker lianxi]# 
\1 表示标签

[root@service /]# echo aaaadadw bbb ccc |sed -rn 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/p'
ccc bbb aaaadadw
[root@service /]# 

3、sed练习:

练习:
1、删除zhangyi 
[root@service lianxi]# sed -i.bakeup 's/zhangyi//g' hehaotian.txt
[root@service lianxi]# 

2、删除每行里的数字
[root@service lianxi]# sed -i.bakeup 's/([0-9])//g' hehaotian.txt
[root@service lianxi]# 

3、删除所有数字或者特殊符号
[root@service lianxi]# sed -i.bakeup 's/[^0-Z ]//g' hehaotian.txt

4、将3行注释、前面加一个#号
[root@service lianxi]# sed -i.bakeup '3s/^/#/' hehaotian.txt

5、包含lipengfei的行前面加注释
[root@service lianxi]# sed -i.bakeup '/lipengfei/ s/^/#/' hehaotian.txt

6、在luqianjun字符串后面加一个sanchaung
[root@service lianxi]# sed -i.bakeup 's/luqianjun/&sanchuang/g' hehaotian.txt

7、以wuhao结尾的行,在末尾加一个zhengyani
[root@service lianxi]# sed -i.bakeup '/wuhao$/ s/$/zhengyani/' hehaotian.txt

=====

练习2:
1./etc/hostname 文件里的名字修改为claylpf
[root@service etc]# sed -i.bakeup -c 's/service/claylpf/' hostname 
[root@service etc]# cat hostname.bakeup 
service
[root@service etc]# cat hostname
claylpf

2.复制/etc/hosts文件到当前目录下,然后进行操作
  在每行前面加一个字符串sanchuang
 [root@service lianxi]# sed -i.bakeup 's/^/sanchuang/' hosts
[root@service lianxi]# cat hosts
sanchuang127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
sanchuang::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
sanchuang192.168.2.200	www.liu.com
[root@service lianxi]# 

3.自己编辑一个文件test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
使用sed或者awk或者编写脚本(shell,python,go等)实现输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

[root@service lianxi]# cat test.txt
0.0.0.0
1.1.1.1
2.2.2.2
[root@service lianxi]# cat test.sh
#!/bin/bash

#sed方法
sed -i.bakeup 's/$/:80,/' test.txt
tr -d '\n'  <test.txt>  newtest.txt
sed -i 's/,$//' newtest.txt
cat newtest.txt

#sed -i.bakeup 's/.*/&:80,/g' test.txt

#awk方法
#awk '{print $0 ":80,"}' test.txt | tr -d '\n' > newtest.txt
#sed -i 's/,$//' newtest.txt
#cat newtest.txt

[root@service lianxi]# 

=====

4.新建一个文本文件sc.txt,内容如下:
abcdSdddde
islHishbxld
goBkefji
daanshXxge
使用sed去处理sc.txt给含有大写字母的行,在大写字母后追加数字2023 
[root@service lianxi]# sed -i.bakeup -r 's/[A-Z]+/&2023/g' sc.txt
[root@service lianxi]# cat sc.txt
abcdS2023dddde
islH2023ishbxld
goBHH2023kefji
daanshXDD2023xge
[root@service lianxi]# 

=====
5.复制/etc/passwd文件到当前目录下,对当前目录下的passwd文件进行操作  --》请不要直接对/etc/passwd操作
	请将所有的非root用户的uid后面加一个0,gid前面加一个1
[root@service lianxi]# sed -i.bakeup -nr '/^root/ s/([0-Z]+):([0-Z]+):([0-9]+):([0-9]+)/\1:\2:0\3:\41/p' passwd
[root@service lianxi]# cat passwd
root:x:00:01:root:/root:/bin/bash
[root@service lianxi]# 



练习:3:

	1.复制/etc/ssh/sshd_config到当前目录下,修改里面的端口号修改为8899
		将#Port 22 配置修改为Port 8899 要求去掉前面的#号,将22修改为8899
[root@service lianxi]# sed -r -i.bakeup  '/^#   Port 22/ s/22/8899/;/^#   Port 8899/ s/#//' ssh_config 

注意:所有的文件建议复制到当前目录下操作,不然重新启动系统会导致系统启动不起来。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux三剑客指的是 awksedgrepawk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。 grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。 ### 回答2: Linux三剑客,分别是awksedgrep,它们是Linux系统中非常重要的命令行工具,它们通常被称为文本处理工具。这些工具通常被用于筛选、搜索和处理文本文件grep是一种常见的文本搜索工具,可以在文件文件夹中搜索指定的字符串或正则表达式。grep可以搜索多个文件并返回匹配行的输出。它是处理日志文件或查找匹配模式的最佳工具之一。 sed是一种流编辑器,可以按照行处理文本文件。它可以通过替换、删除和插入操作来修改文件内容。在大型文件中查找并替换模式是sed的主要作用。该工具通常在文本文件中提取有用信息是常用。 awk是一种强大的文本操作工具,可以分析大型文本文件并对其进行处理。该工具可以遍历行和列,并提供强大的文本处理工具,如计算、过滤和转换数据。awk处理速度非常快,适用于处理大型数据文件Linux三剑客awk是最强大的工具,它可以执行复杂的文本数据操作和转换,可大大简化开发和管理过程。sed主要用于简单的文本数据过滤和替换,而grep主要用于搜索文件和定位特定行。 总之,Linux三剑客在文本数据处理方面具有不可替代的重要作用。对于Linux操作系统的开发人员和管理员来说,熟练使用这些工具可以提高他们的工作效率,使他们更容易管理和操作文本文件。 ### 回答3: Linux三剑客awk sed grep是我们在日常工作中经常使用的三个命令。它们都属于文本处理工具,可以用于查找、处理、分析文本文件等。 首先,grep是最常用的文本搜索工具。grep可以用来快速查找文件中指定的字符串或正则表达式,并将包含该字符串或正则表达式的行打印出来。常用的命令grep、egrep和fgrep。比如,我们可以使用grep命令来查找一个文件中包含指定关键字的行,可以使用egrep来支持正则表达式搜索,使用fgrep来进行快速搜索,不支持正则表达式。 其次,sed是一种流编辑器,主要用于对文本文件进行替换、删除、添加、插入等操作。sed命令可以通过管道(|)将多个命令组合起来,从而进行复杂的文本操作。sed可以快速完成对文本文件的修改操作,比如替换文件中的某些内容、删除特定的行、在文件中插入新的文本等。sed命令形式是“command", 比如"s/old/new/g",表示将old替换成new。 最后,awk是一种强大的文本处理工具,主要用于在文本文件中查找、处理以及格式化特定的字段。和grepsed不同的是,awk更加灵活,可以在处理过程中做到数据过滤和加工,对于大数据的处理特别有用。awk命令的常用语法是"pattern {action}"。其中,pattern代表要匹配的模式,而action代表模式匹配时需要执行的动作,我们可以在其中添加处理语句来对文件进行各种处理操作,比如计算、统计、格式化等。 综上所述,Linux三剑客awk sed grep是我们在文本处理工作中不可或缺的三个工具,不同的工具可以用于处理不同的文本操作,也可以用于搭配使用,以完成更加复杂的文本处理工作。对于需要经常处理文本的人员来说,掌握这些工具是非常必要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值