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

shell脚本初级知识点整理 ----------------------------------------------------- 判断是否为空 STRING= if [ -z "$STRING" ]; then echo "STRING is empty" fi if [ -n "$STRING" ]; then echo "STRING is not empty" fi -----------------... 阅读详情

目录

文本处理三剑客: 

    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 

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

Linux三剑客grep、awk和sed grep(Global Regular Expression Print) 命令用于搜索文件的特定模式,它不能增加、修改、删除文本内容,通常用于搜索过滤文本,显示被模式匹配到的行。使用正则表达式进行文本匹配(正则表达式参考文章《Python正则表达式》),它的使用权限是所有用户。扩展正则表达式(egrep)添加-E-P参数可以让grep使用perl的正则表达式语法。 阅读详情

相关推荐

【第六章:常用工具命令】第23节:常用命令 - Linux命令

大家好,很高兴我们可以继续学习交流Java高频面试题。本小节开始,我们进入了常用工具命令篇章。我们分三个小节来交流常见工具的命令及其作用。包括Linux常用命令,Maven常用命令以及Git常用命令。本小节中,我们主要针对面试中以及日常开发工作中常用的Linux命令进行学习。 做为一名服务端开发人员,我们的开发环境大多都是Linux环境,并且服务器也是Linux环境,那么我们必须学会一些常用的Linux命令。熟练掌握和使用Linux命令可以大幅度提升我们的日常工作效率,比如日志的检索和统计等工作。 Lin.

冷血之心的博客 672

Linux从文件中逐行读取文件名并将匹配的文件复制到指定目录教程

希望以上教程对你在Linux系统中逐行读取文件名并复制文件到指定目录有所帮助。如有其他疑问,请提供更多细节或参考相关文档以获取更多支持。文件中的文件名是否正确,并备份重要文件以防止意外数据丢失。请确保在执行复制操作前,仔细检查。替换为实际的目标目录路径。替换为实际的目标目录路径。使用循环结构逐行读取。

高性价比服务器就选:蓝易云 911

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 410

Linux--文件处理三剑客(一)(sed详解)

文章目录sed编辑器概述工作流程读取执行显示命令格式常用选项常用操作示例打印内容使用地址删除行替换标记插入 sed编辑器 概述 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中 流编辑器的工作过程可以理解为:是从上往下依次执行,就像流水一样,一行一行逐行来执行的 工作流程 主要包括以下这三个过程 读取 sed从输入流(文件、管道、标准输入)中读取一行内容

Xucf1 1732

新手避坑指南:用PIC16F15355开发板和MCC完成第一个UART通信项目

本文为新手提供了使用PIC16F15355开发板和MPLAB代码配置器(MCC)实现首个UART通信项目的完整指南。通过图形化配置系统时钟、UART参数并自动生成驱动代码,手把手教学如何避开常见陷阱,快速完成从环境搭建、代码编写到调试输出的全流程,助力开发者高效入门PIC单片机开发。

bash7scripter的博客 725

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 364

Linux三剑客(grep、awk、sed)超详细版

Linux的用户都知道,在Linux下一切皆文件,所以Linux下的操作就是对文件的操作。出于对文件更好的操作,今天给大家介绍一下常用的文本操作“三剑客”命令。

一只程序猿的修炼之旅 1万+

Ubuntu20.04下Pycharm的快速安装与配置指南

本文提供了一份详细的Ubuntu 20.04系统下PyCharm社区版的安装与配置指南。文章重点介绍了通过手动下载.tar.gz压缩包进行安装的灵活方法,并涵盖了系统准备、依赖安装、首次运行、创建快捷方式以及解释器配置等关键步骤,帮助Python开发者快速搭建高效、可控的本地开发环境。

weixin_28831341的博客 379

利器 | 测试必会之 Linux 三剑客 ( grep / awk / sed )

以目前国内最大的测试社区网站 testerhome 为例,访问 testerhome 主页,找出主页中包含的左右 url,分别进行访问,如果访问成功会返回状态码200,检查所有访问成功的url并打印出来,若没访问成功就打印ERR加上失败的url。这时如果想要修改源文件就需要借助-i命令,另外为了防止误操作修改文件,一般可以采取这种写法:sed -i.bak ‘s/hello/HELLO/’ text.txt,这种写法在修改源文件的同时还会生成一份以.bak结尾的备份文件,相较安全。

weixin_71807218的博客 1043

Python海康摄像头SDK二次开发

摘要:为解决海康威视摄像头RTSP拉流延迟严重的问题,本文提出改用海康私有SDK直接取流的方案。通过下载海康设备网络SDK并调用其Python接口,实现了低延迟的视频流获取。文中详细介绍了SDK配置流程,并提供了优化版的Python代码示例,重点解决回调函数处理、队列缓冲和CPU占用等问题。测试结果表明,该方案显著降低了延迟,同时保持了较高的帧率(30FPS以上)和较低的CPU占用率(约2%)。相较于传统OpenCV+FFmpeg的RTSP方案,海康SDK直接取流在实时性方面具有明显优势。

xiaohouzi112233的博客 2608

基于STM32与SimpleFOC实现直流无刷电机开环控制的实战指南

本文提供了一份基于STM32微控制器与SimpleFOC开源库实现直流无刷电机开环控制的详细实战指南。内容涵盖硬件连接、PlatformIO环境搭建、核心代码解析及上电测试,旨在帮助开发者快速验证硬件并理解开环控制的基本原理,为后续实现高性能的闭环FOC控制奠定基础。

xxx12的博客 960

shell三剑客

sed可以交换保持空间和模式空间的数据(一般都是将保持空间的数据,拿到模式空间进行操作),但是不能在保持空间上执行普通的sed命令,也就是说我们可以在保持空间存储数据。① RS既record separator输入输出数据记录分隔符,每一行是怎么没的,表示每个记录输入的时候的分隔符,既行与行之间如何分隔,默认为\n,可以调整为其他字符。注意:不建议使用 /,建议使用 #,因为,/ 容易 混淆,比如说,我的内容中就有 /,如果要替换了,那是不是要加,转移字符\/

2301_77031835的博客 1178

嵌入式开发必备:UART、RS232、RS485通信协议实战对比(附代码示例)

本文从嵌入式开发实战角度,深度对比了UART、RS232和RS485三种核心串行通信协议。详细解析了它们的工作原理、硬件连接、代码配置及典型应用场景,并提供了基于通信距离、节点数量和电磁环境的三维度选型指南,帮助开发者根据项目需求做出最优技术决策。

i0j1k2l3m的博客 474

【Linux上分之路】第十二篇:Linux三剑客grep、sed、awk

文章目录Linux三剑客三剑客特点及应用场景grepgrep命令的基本格式grep范例grep命令选项-A、-B-c、-v-n、-wsedsed命令基本格式sed命令功能sed执行过程sed执行流程sed流程解析sed功能查找删除增加cai替换(重点)sed的后向引用awkawk执行流程awk执行案例分析awk的内置变量awk行与列取行取列awk模式匹配比较正则表示范围特殊模式awk数组awk批量输出数组内容总结 Linux三剑客 Linux三剑客是grep、sed、awk三者的简称,熟练使用这三个工具程.

justilake的博客 873

FAST-LIO2:论文和算法解析

本文介绍了FAST-LIO2算法:一种快速、鲁棒、通用的激光雷达-惯性里程计框架。FAST-LIO2基于高效的紧密耦合迭代卡尔曼滤波器,具有两个关键的新颖之处,可实现快速,稳健和准确的激光雷达导航(和测绘)。第一种方法是直接将原始点注册到地图上然后更新地图,而不提取特征。这样可以利用环境中的细微特征,从而提高准确性。消除手工设计的特征提取模块,也使其能够适应不同扫描模式的新兴激光雷达;

超爱吃小蛋糕的66的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux命令行统计行数_Linux三剑客

下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。grep1.分类grep命令家族由g...

weixin_29985807的博客 1323

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《Linux从小白到高手》理论篇:vi/vim编辑器和Linux文件处理“三剑客”(sed/grep/awk)

本篇介绍vi/vim编辑器和Linux文件处理“三剑客”(sed/grep/awk),这5个工具命令可能是Linux最最常用的,而且功能超级强大。

qq_45732829的博客 1494

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux三剑客

我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。 在说这三个命令前我们要插入一个小插曲就是“正则表达式”。 转载:https://blog.youkuaiyun.com/sj349781478/article/details/82930982 一、正则表达式 所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。 三剑客与正则表达式是什么关系呢? ...

weixin_39618279的博客 532

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

shell脚本最常见的一个用途就是处理文本文件。检查日志文件、读取配置 文件、处理数据元素,shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动化。但仅靠shell脚本命令来处理文本文件的内容有点力不从心的。如果想在shell脚本中处理任何类型的数据,掌握grep,sed和gawk工具可以达到事半功倍的效果。企业开发中常用,高阶命令。 linux文本处理三剑客:grep+sed+awk(gawk) 16.0 grep的使用 所有的类linux系统都会提供一个名为grep(global re

涤生大数据 2562

Linux:管道命令与文本处理三剑客(grep、sed、awk)

1 管道命令(pipe)介绍众所周知,bash命令执行的时候会输出信息,但有时这些信息必须要经过几次处理之后才能得到我们想要的格式,此时应该如何处置?这就牵涉到 管道命令(pipe) 了。管道命令使用的是|这个界定符号。另外,管道命令与连续执行命令是不一样的,这点下面我们会说明。我们先来看一个管道命令的例子。假设我们需要看/etc目录下有多少文件,那么可以利用ls /etc来查看,不过由于文件数量太多,导致一口气就将屏幕塞满了,而不知道前面输出的内容是啥:total 944。

dyuan134的博客 508

shell中的文本处理正则表达式(grep+sed+awk:俗称linux中的三剑客)

文章目录一、正则表达式二、grep文本过滤命令1、grep是什么2、grep 的格式三、sed行编辑器(stream editor)1、sed命令2、Sed 命令格式3、sed 对字符的处理四、awk(报告生成器)1、什么是awk(报告生成器)2、awk的用法 一、正则表达式 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE...

ranrancc_的博客 665

Linux命令---awk

grep,sed,awk合称Linux命令三剑客。接下来简单对awk进行一个总结。 awk是一种处理文本文件的语言,是一个强大的文本分析工具。 基本用法 前提:text.txt文档作为例子,来进行awk相关操作。内容如下 1 My name is Mary 2 I'm a beautiful girl 3 I like basketball,football,tennis 4 but...

扛麻袋的少年的博客 3460

shell-正则表达式与文本三剑客grep、sed、awk

linux 正则表达式的相关命令选项操作

koeda1的博客 1401

《linux三剑客常用命令》PDF资源介绍

《linux三剑客常用命令》PDF资源介绍 去发现同类优质开源项目:https://gitcode.com/ 在此仓库中,我们提供了《linux三剑客常用命令.pdf》资源文件,旨在帮助用户深入理解和掌握Linux系统中三个强大的文本处理工具:grep、sed、awk,它们被合称为Linux三剑客。 资源简介 grep/egrep/fgrep: 这些是文本过滤工具,可以帮助用户快速查找文件中匹配...

gitblog_06797的博客 497

3. linux常用命令及三剑客 grep sed awk 用法初始

linux 常用命令:文件、网络、性能 一.常用命令 文件 ls cd pwd mkdir cp rm mv 文件属性 # 授权 r: 读权限 4; w: 写权限 2; x: 操作权限 ; r+w+x=7,是最高权限 chomd 777 文件名 网络 ping # 测试网络连接情况 ping -c 5 www.baidu.com # ping 5次百度 ping -l 2 www....

weixin_41696733的博客 276
上一篇: Mysql - Mysql的字段属性(存储引擎、外键)
下一篇: Mysql - shell操控Mysql数据库的方法(delete和truncate解释)
Claylpf
博客等级 码龄6年 78粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值