700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > linux基础命令 - 文件处理三剑客(grep - awk - sed)

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

时间:2018-08-05 15:18:27

相关推荐

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/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@mysql /]# cat /etc/passwd|grep "root" --》通过管道符号传输查找root:x:0:0:root:/root:/bin/bashoperator: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--》对扩展正则的支持 或者 直接使用egrepwuhao:x:1003:1003::/home/wuhao:/bin/bashwuhao123:x:1004:1004::/home/wuhao123:/bin/bashliquan:x:1006:1006::/home/liquan:/bin/bash[root@mysql lianxi]# [root@mysql lianxi]# grep "wuhao\|liquan" passwd --》对 | 符号进行转义wuhao:x:1003:1003::/home/wuhao:/bin/bashwuhao123:x:1004:1004::/home/wuhao123:/bin/bashliquan: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/bashwuhao123:x:1004:1004::/home/wuhao123:/bin/bashliquan:x:1006:1006::/home/liquan:/bin/bash[root@mysql lianxi]#

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

单词的定界符号: [root@web1 lianxi]# cat sc.txt liquan123 liquanabc fengliquan zhangliquan123liquanxiaoliquanxiaoliquanliu[root@web1 lianxi]# cat sc.txt |egrep "\<liquan"--》单词以liquan开头liquan123 liquanabc fengliquan zhangliquan123liquan[root@web1 lianxi]# cat sc.txt |egrep "\<liquan\>"--》单词以liquan开头和结尾liquan[root@web1 lianxi]# cat sc.txt |egrep "liquan\>"--》单词以liquan结尾liquan123 liquanabc fengliquan zhangliquan123liquanxiaoliquan[root@web1 lianxi]# cat sc.txt |egrep "liquan\b"--》跟上面一样的意思liquan123 liquanabc fengliquan zhangliquan123liquanxiaoliquan[root@web1 lianxi]# cat sc.txt |egrep "\bliquan"liquan123 liquanabc fengliquan zhangliquan123liquan[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]" passwd4、查找出当前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/bash8、查找/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.qillu.edursync:///abcftp://192.168.0.1ftp://(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@1234feng@meng.xianhui@liudehua@10001@123_ui@fengdeyong 123qilu@qilu.eduqilu@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\>"root101420 0.0 0.2 115676 2176 pts/0 Ss 3月14 0:00 -bashroot105563 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月1400: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 00 0.0.0.0:80 0.0.0.0:*LISTEN1184/nginx: master tcp 00 0.0.0.0:22 0.0.0.0:*LISTEN1114/sshd tcp 00 127.0.0.1:25 0.0.0.0:*LISTEN1614/master tcp 0 232 192.168.2.205:22 192.168.2.126:62097ESTABLISHED 9147/sshd: root@pts tcp 00 192.168.2.205:22 192.168.2.126:62065ESTABLISHED 9121/sshd: root@pts tcp6 00 :::22 :::*LISTEN1114/sshd tcp6 00 ::1:25 :::*LISTEN1614/master udp 00 127.0.0.1:323 0.0.0.0:* 781/chronyd udp6 00 ::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.00.0.0.00.0.0.00.0.0.0127.0.0.10.0.0.0172.20.10.3202.141.160.110172.20.10.3172.20.10.2127.0.0.10.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.0127.0.0.1172.20.10.2172.20.10.3202.141.160.110[root@mysql lianxi]#

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

-04-25T09:56:58+08:00||210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|--04-25T09:57:58+08:00||47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4-04-25T09:56里每秒钟-04-25T09:56:0~59-04-25T09:56:([0-9]|[1-5][0-9])-04-25T09:5609点里的每分钟-04-25T09:0~59-04-25T09:([0-9]|[1-5][0-9])-04-25T09:57:55+08:00 80-04-25T09:57:58+08:00 20-04-25T09:57:59+08:00 50-04-25T09:58:55+08:00 800-04-25T09:58:58+08:00 20-04-25T09:58:59+08:00 50-04-25T09:59:55+08:00 800-04-25T09:59:58+08:00 20-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 $num41[root@web1 lianxi]#第二次练习[root@service /]# df -ThFilesystemTypeSize Used Avail Use% Mounted ondevtmpfs devtmpfs 471M0 471M 0% /devtmpfstmpfs487M0 487M 0% /dev/shmtmpfstmpfs487M 15M 472M 4% /runtmpfstmpfs487M0 487M 0% /sys/fs/cgroup/dev/sda3xfs 18G 6.9G 11G 39% /--》 截取 39%/dev/sda1xfs 297M 152M 145M 52% /boottmpfstmpfs98M 44K 98M 1% /run/user/1000tmpfstmpfs98M0 98M 0% /run/user/0[root@service /]# df -Th|egrep "/$"/dev/sda3xfs 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 639%[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 ssh2Mar 19 14:40:19 web1 sshd[8742]: Accepted password for root from 192.168.2.126 port 62037 ssh2Mar 19 14:41:37 web1 sshd[9121]: Accepted password for root from 192.168.2.126 port 62065 ssh2Mar 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.txt12.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.txt128.123.123.123168.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 输入分隔符的变量

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

2.输出分隔符

默认是一个空格

OFS 指定输出分隔符 输出分隔符的变量

OFSThe output field separator, a space by default.

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

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

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

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

[root@service /]# awk -F ":" '{print $1,$2}' /etc/passwd|head -n 10 --》$1,$2中 逗号是调用输出分割符(默认是空格)head -n 10 表示只读取10行root xbin xdaemon xadm xlp xsync xshutdown xhalt xmail xoperator x[root@service /]# [root@service /]# awk -F ":" '{print $1 $2}' /etc/passwd|head -n 10 --》 ":" 表达的是输入分隔符rootxbinxdaemonxadmxlpxsyncxshutdownxhaltxmailxoperatorx[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/bashbin x bin:x:1:1:bin:/bin:/sbin/nologindaemon x daemon:x:2:2:daemon:/sbin:/sbin/nologinadm x adm:x:3:4:adm:/var/adm:/sbin/nologinlp x lp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync x sync:x:5:0:sync:/sbin:/bin/syncshutdown x shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt x halt:x:7:0:halt:/sbin:/sbin/haltmail x mail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator 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/passwd38 7 nfsnobody 9 /sbin/nologin /var/lib/nfs 6553448 7 caocao 6 /bin/bash /anhui/bozhou 889849 7 liyanqing 9 /sbin/nologin /home/liyanqing 8899total:3[root@service /]# $1~/feng/ --》 表示在feng 包含(~) 在第一个字段里面BEGIN --》 只在文件开头运行一次END --》 只在文件结尾运行一次NFThe number of fields in the current input record. 一行里有多少个字段(列)NRThe 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}'开始计数daemonadmhaltmailoperatorgameslibstoragemgmtsanedsaslauthabrtradvdgnome-initial-setupavahiclay666caocaoliyanqingsum=16[root@service /]#

4、awk的for循环

awk数组的使用

awk的数组[root@service /]# cat /etc/passwd|awk -F ":" '{user[$1]=$3;print $1,user[$1]}'|headroot 0bin 1daemon 2adm 3lp 4sync 5shutdown 6halt 7mail 8operator 11[root@service /]# [root@service /]# cat /etc/passwd|awk -F ":" '{user[$1]=$3}END{for(i in user) print i,user[i]}'|headadm 3rpc 32radvd 75sync 5mail 8clay666 1000tss 59mysql 27gluster 995unbound 991[root@service /]#

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

练习: 游戏充值累加求和[root@service lianxi]# cat bill.txt username moneyfeng 100feng 200feng 350li 200li 239li 890zhang 100zhang 350feng8000li10000[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 11329feng 8650zhang 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 450li 11329feng 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 3008649li 11329zhang 450[root@service lianxi]#

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

[root@service lianxi]# cat ip.txt 172.16.130.26 16274.7172.16.20.126 8783.61172.16.130.33 5876.59172.16.130.33 5876.59172.16.13.145 5389.23172.16.130.26 16274.7172.16.130.26 16274.7172.16.145.173 4974.36172.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.8172.16.13.145 5389.23172.16.20.126 8783.61172.16.130.26 48824.1172.16.145.173 4974.36[root@service lianxi]# [root@service lianxi]# yum install net-tools -y使用ifconfig 查看流量并且截取流量 求和yum install net-tools -yifcofnig

练习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--------------------------------------04-25T09:51:58+08:00||47.52.197.27|GET /v2/depth?symbol=aaa HTTP/1.1|200|24|-|apple-04-25T09:52:58+08:00||47.75.159.123|GET /v2/depth?symbol=bbb HTTP/1.1|200|407|-|python-requests/2.20.0-04-25T09:53:58+08:00||13.125.219.4|GET /v2/ticker?timestamp=1556157118&symbol=ccc HTTP/1.1|200|162|-|chrome-04-25T09:54:58+08:00|d.shuzibi.co|-||HEAD /justfor.txt HTTP/1.0|200|0|-|--04-25T09:55:58+08:00||13.251.98.2|GET /v2/order_detail?apiKey=ddd HTTP/1.1|200|231|-|python-requests/2.18.4-04-25T09:56:58+08:00||210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|--04-25T09:57:58+08:00||47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4-04-25T09:58:58+08:00||47.75.58.56|GET /v2/depth?symbol=ggg HTTP/1.1|200|404|-|safari-04-25T09:59:58+08:00||188.40.137.175|GET /v2/trade_detail?symbol=hhh HTTP/1.1|200|6644|-|--04-25T10:01:58+08:00||2600:3c01:0:0:f03c:91ff:fe60:49b8|GET /v2/myposition?apiKey=jjj HTTP/1.1|200|110|-|scan1、计算每分钟的带宽:[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]}'-04-25T10:01 110-04-25T09:56 24-04-25T09:57 397-04-25T09:58 404-04-25T09:59 6644-04-25T09:51 24-04-25T09:52 407-04-25T09:53 162-04-25T09:54 200-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 2GET /v2/ticker 2GET /v2/order_detail 1GET /v2/depth 4GET /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]}'-04-25T09:55/v2/order_detail 1-04-25T10:01/v2/myposition 1-04-25T09:59/v2/trade_detail 1-04-25T09:53/v2/ticker 1-04-25T09:54/v2/ticker 6-04-25T09:58/v2/depth 1-04-25T09:57/v2/depth 5-04-25T09:52/v2/depth 1-04-25T09:51/v2/depth 1-04-25T09:56/v2/trade_detail 1[root@service lianxi]# 3、统计每个state的状态netstat -anplutProto Recv-Q Send-Q Local AddressForeign Address Statetcp 00 172.16.18.227:38734 172.16.10.25:5921 ESTABLISHED tcp 00 172.16.18.227:33046 172.16.17.83:5921 ESTABLISHED tcp 00 127.0.0.1:38978 127.0.0.1:12321 TIME_WAIT tcp 00 127.0.0.1:38990 127.0.0.1:12321 TIME_WAITtcp 00 127.0.0.1:3306 127.0.0.1:35422 ESTABLISHED tcp 00 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 3TIME_WAIT 3[root@claylpf lianxi]#

5、awk练习:

练习:1、使用NF变量显示passwd文件倒数第二列的内容[root@mysql lianxi]# awk -F: '{print $(NF-1)}' /etc/passwd2、显示passwd文件中第5到第10行的用户名[root@mysql lianxi]# awk -F: 'NR>=5&&NR<=10 {print NR,$1}' passwd5 lp6 sync7 shutdown8 halt9 mail10 operator3、显示passwd文件中第7列不是bash的用户名[root@mysql lianxi]# awk -F: '$7!~/bash/ {print $1}' passwd4、显示passwd文件中行号是5结尾的行号和行[root@mysql lianxi]# awk -F: 'NR~/5$/ {print NR,$1}' passwd5 lp15 dbus25 WUHAO456[root@mysql lianxi]# 5、ip add只显示ip(不能使用tr或者cut命令)[root@mysql lianxi]# ip add|awk '/inet.*ens33$/{print $2}'172.20.10.3/246、使用awk显示ens33的入站流量和出站流量(字节)[root@mysql lianxi]# ifconfig ens33|awk '/RX p|TX p/ {print $5}'2620511901013247267[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 100feng 200feng 350li 200li 239li 890zhang 100zhang 350[root@mysql lianxi]# cat name.txt | awk '{name[$1]+=$2} END{for(i in name) print i,name[i]}' |sort -k2 -nrli 1329feng 650zhang 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 isomitted, 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)}'|tailsspo........

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

[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/bashchangsha2:x:8901:8902::/home/changsha2:/bin/bash[root@service lianxi]# awk -F: "/^$city/ {print \$1,\$3}" /etc/passwd -->传递参数进入的时候需要进行转义“\”changsha1 8900changsha2 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 2welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 3welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 4welcome 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' --》从第一行开始,隔一行读一行1hehaotian luqianjun zhanglinfeng zhangyi3hehaotian luqianjun zhanglinfeng zhangyi5liujb lipengfei7liujb lipengfei wuhao gaohui[root@docker lianxi]# cat -n hehaotian.txt|sed -n '2~2p' 2hehaotian luqianjun zhanglinfeng zhangyi4hehaotian luqianjun zhanglinfeng zhangyi6liujb 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 10welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 11welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 12welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 13welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 14welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 15welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 16welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 17welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 18welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 19welcome to sanchuang fengdeyong hehaotian zhouxi zhenyani lianyu 20[root@docker lianxi]#

因此sed 查找方式:

1.根据行号

2.根据模式-->正则表达式=字符+特殊符号

3.根据字符串 -->根据日志的日期去查找

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

sed 可以根据字符串进行时间段的匹配Apr 2 14:23:36Apr 2 15:01:01sed -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.txt4、将3行注释、前面加一个#号[root@service lianxi]# sed -i.bakeup '3s/^/#/' hehaotian.txt5、包含lipengfei的行前面加注释[root@service lianxi]# sed -i.bakeup '/lipengfei/ s/^/#/' hehaotian.txt6、在luqianjun字符串后面加一个sanchaung[root@service lianxi]# sed -i.bakeup 's/luqianjun/&sanchuang/g' hehaotian.txt7、以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 hostnameclaylpf2.复制/etc/hosts文件到当前目录下,然后进行操作在每行前面加一个字符串sanchuang[root@service lianxi]# sed -i.bakeup 's/^/sanchuang/' hosts[root@service lianxi]# cat hostssanchuang127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4sanchuang::1 localhost localhost.localdomain localhost6 localhost6.localdomain6sanchuang192.168.2.[root@service lianxi]# 3.自己编辑一个文件test.txt,内容如下:0.0.0.01.1.1.12.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.txt0.0.0.01.1.1.12.2.2.2[root@service lianxi]# cat test.sh#!/bin/bash#sed方法sed -i.bakeup 's/$/:80,/' test.txttr -d '\n' <test.txt> newtest.txtsed -i 's/,$//' newtest.txtcat 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,内容如下:abcdSddddeislHishbxldgoBkefjidaanshXxge使用sed去处理sc.txt给含有大写字母的行,在大写字母后追加数字 [root@service lianxi]# sed -i.bakeup -r 's/[A-Z]+/&/g' sc.txt[root@service lianxi]# cat sc.txtabcdSddddeislHishbxldgoBHHkefjidaanshXDDxge[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 passwdroot: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 注意:所有的文件建议复制到当前目录下操作,不然重新启动系统会导致系统启动不起来。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。