1. SED流编辑器

1.1 什么sed

Snipaste_2020-09-28_10-40-07.png

1.2 sed 选项和内置符

sed [选项] 说明
-n 取消默认输出(p搭配使用)
-i 修改文件内容(不加只修改打印内容)
-e 允许多次编辑
-r 扩展正则
sed内置符 说明
a append,追加文本。在指定行后添加一行或多行文本
i insert,匹配行的文本
d delete,删除匹配内容
p print,通常p会和-n一起使用
s/内容/替换内容/g 全局的内容替换
c 更改[line-address]

把txt文件中包含test行的 行尾添加 ‘000’

  1. sed -i '/test/ s/$/000/' file

在 某行上或下添加一行 新内容

sed某行追加内容.txt

将某行匹配后替换

sed -i ‘/^SELINUX=/c SELINUX=disabled’ /etc/selinux/config

1.3 sed简单示例

取行(常用)

[root@web01 test]# sed -n ‘2,3p’ oldboy.txt
I teach linux.

搜索

[root@web01 test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com

按范围搜索: sed -n ‘/oldboy/,/oldgirl/p’ fanwei.txt (可按时间段搜索)

删除

‘2,8d’删除指定的行(不会删除源文件 -i修改原文件爱你)
[root@web01 test]# sed ‘/oldboy/d’ oldboy.txt
I teach linux.

更改

sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

EX sed -i ‘/^User/c User www’ /etc/httpd/conf/httpd.conf [root@web01 ~]# grep ‘User www’ /etc/httpd/conf/httpd.conf User www

取值

取IP地址:
ip addr|sed -nr ‘s#^.inet (.)/24.*$#\1#gp’

问题2:过滤出含有oldboy字符串的行※。 [root@oldboy ~/test]# grep “oldboy” oldboy.txt
I am oldboy teacher! our site is http://www.oldboyedu.com [root@oldboy ~/test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher! our site is http://www.oldboyedu.com

1.4 sed正则实践

[root@oldboy ~/test]# sed -n ‘/^$/p’ oldboy.txt
[root@oldboy ~/test]# sed -n ‘/^I/p’ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy ~/test]# sed -n ‘/m$/p’ oldboy.txt
our site is http://www.oldboyedu.com

问题3:删除含有oldboy字符串的行※。 sed ‘/oldboy/d’ oldboy.txt
sed ‘3d’ oldboy.txt #<==删第3行。 sed ‘5,8d’ oldboy.txt #<==删5-8行。

利用正则删除空行 sed ‘/^$/d’ oldboy.txt

问题4:将文件中的oldboy字符串全部替换为oldgirl※。
sed ‘s#oldboy#oldgirl#g’ oldboy.txt
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
sed -e ‘s#oldboy#oldgirl#g’ -e “s#49000448#31333741#g” oldboy.txt
问题6:在oldboy.txt文件的第2行后追加文本。
自动化操作用到。。
sed ‘2a I teacher linux.’ oldboy.txt
问题7:在oldboy.txt文件的第2行插入文本。
解答:这是考察sed命令的i字符功能,示例如下。
sed ‘2i I teacher linux,at 2i.’ oldboy.txt
问题8:在oldboy.txt文件的第2行插入两行文本。
sed ‘2i I teacher linux.\nYou are my student.’ oldgirl.txt

ssh连接优化:

Linux 远程连接慢如何解决: 备份: cp /etc/ssh/sshd_config{,.ori} vim /etc/ssh/sshd_config 修改如下: UseDNS no GSSAPIAuthentication no 保存,重启sshd服务, systemctl restart sshd /etc/ssh/sshd_config Port 22 ListenAddress 10.0.0.100 sed ‘13i Port 22\nListenAddress 10.0.0.100’

sed配合正则的一些案例:
[root@oldboy ~/test]# cat oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

[root@oldboy ~/test]# sed -n ‘/oldboy/p’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
过滤空行:
[root@oldboy ~/test]# sed -n ‘/^$/p’ oldboy.txt
过滤以m结尾
[root@oldboy ~/test]# sed -n ‘/m$/p’ oldboy.txt
our site is http://www.oldboyedu.com
过滤以I开头
[root@oldboy ~/test]# sed -n ‘/^I/p’ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy ~/test]# sed -n ‘/^I/d’ oldboy.txt
贪婪
^. 以任意多个字符开头
.
$ 以任意多个字符结尾

1.5 sed取IP地址

[root@oldboy ~/test]# ifconfig eth0
eth0: flags=4163 mtu 1500
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 5431 bytes 509956 (498.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3919 bytes 550320 (537.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’|sed ‘s#^.inet ##g’
10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
[root@oldboy ~/test]# ifconfig eth0|sed -n ‘2p’|sed ‘s#^.
inet ##g’|sed ‘s# net.*$##g’
10.0.0.100

掐头去尾,留中间se.png

后项引用的使用方法 sed -nr ‘s/ 狗头(.)尾巴/\1/gp’ \n 代表引用第几个括号
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.
inet (.) net.$#\1#gp’
10.0.0.100

练习取644
[root@oldboy ~/test]# stat /etc/hosts
File: ‘/etc/hosts’
Size: 195 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 8873533 Links: 2
Access: (0644/-rw-r—r—) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:net_conf_t:s0
Access: 2021-10-01 00:00:47.019002826 +0800
Modify: 2020-09-10 10:06:22.861013547 +0800
Change: 2020-09-27 00:05:33.885665600 +0800
Birth: -
[root@oldboy ~/test]# stat /etc/hosts | sed -rn ‘s#^.(0(.)/-.*$#\1#gp’
644

练习取子网掩码
[root@oldboy ~/test]# ifconfig eth0
eth0: flags=4163 mtu 1500
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::a39b:4793:644:e2bd prefixlen 64 scopeid 0x20
ether 00:0c:29:bf:1e:0d txqueuelen 1000 (Ethernet)
RX packets 6541 bytes 613038 (598.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4747 bytes 642174 (627.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~/test]# ifconfig eth0|sed -rn ‘s#^.mask (.) br.*$#\1#gp’
255.0.0.0

1.6 sed 后向引用图解

image.png

扩展命令cut

命令cut      cut   OPTION... [FILE]...
用来显示行中的指定部分,cut经常用来显示文件的内容
     选项 :-d 指定分隔符 
              -f 数字,取第几列 (例–f3,6三列和6列 )
              -c 按字符取列(空格也算)
https://blog.csdn.net/yangshangwei/article/details/52563123

实现方法1:
[root@web01 test]# cat test.txt
oldboy oldgirl
oldboy oldgirl
oldboy oldgirl
...

[root@web01 test]# cut -d" " -f1,2  test.txt
oldboy oldgirl
oldboy oldgirl
oldboy oldgirl
...

[root@web01 test]# cut -c 1-7,8-14 test.txt 
oldboy oldgirl
oldboy oldgirl
...

2. awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
完全体:
Snipaste_2020-10-22_08-56-39.png

其他高级用法 grep | sed | awk --- 示例 - 图7

awk ‘{print NR}’ filename; 只打印行号

awk ‘{print $0}’ filename; 打印全部行

扩展用法

awk功能.png

awk取行操作

取行: && 2-3行(优先sed) NR表示行号,&&并且
[root@web01 test]# awk ‘NR>1&&NR<4’ oldboy.txt
I teach linux.
#取行: ,
[root@web01 test]# cat -n oldboy.txt | awk ‘NR2,NR6’
2 I teach linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 our site is http://www.oldboyedu.com
6 my qq num is 49000448.

取一行
[root@web01 test]# awk ‘NR==2’ oldboy.txt
I teach linux.

awk取列操作

默认空格最为分割符

[root@web01 test]# cat test.txt
oldboy oldgirl test
$1 $2 $NF(倒数第二列 $(NF-1))
[root@web01 test]# awk ‘{print $1,$2,$NF}’ test.txt
oldboy oldgirl test

-F 指定分割符

awk取出/etc/passwd 第三列第四列
[root@web01 test]# awk -F “:” ‘{print $3,$4}’ /etc/passwd
998 996
10001 10001
10002 10002
10003 10003
10004 10004

centos7取IP地址:取列取行组合
[root@web01 test]# ifconfig eth0 | awk ‘NR==2{print $2}’
10.0.0.7

-F [ ] 指定多种分割条件

[root@web01 test]# awk -F “[ :]” ‘{print $13}’ c6.txt
10.0.0.7

-F [ ]+指定连续出现的多种分割符

[root@web01 test]# cat c6.txt
inet addr:10.0.0.7 Bcast:10.0.0.255 Mask:255.255.255.0
[root@web01 test]# awk -F “[ :]+” ‘{print $4}’ c6.txt
10.0.0.7

-F( | )指定多个组合条件

[root@web01 test]# awk -F “(addr:| Bcast)” ‘{print $2}’ c6.txt
10.0.0.7

-F “[a-z,A-Z: ]+”

取行取列操作:

ifconfig eth0 | awk ‘/inet / {print $2}’


练习: 过滤出含有oldboy字符串的行*

[root@web01 test]# grep ‘oldboy’ oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@web01 test]#
[root@web01 test]#
[root@web01 test]# sed -n ‘/oldboy/p’ oldboy.txt
[root@web01 test]# awk ‘/oldboy/‘ oldboy.txt

练习: 删除含有oldboy字符串的行*

[root@web01 test]# sed ‘/oldboy/d’ oldboy.txt
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@web01 test]# awk ‘!/oldboy/‘ oldboy.txt
[root@web01 test]# grep -v ‘oldboy’ oldboy.txt

练习:取出文件的$1,$3,$NF,并打印行号。

[root@web01 test]# awk -F “:” ‘{print $1,$3,$NF,NR}’ /etc/passwd
test 10003 /bin/bash 29
baba 10004 /bin/bash 30
oldgg 10005 /bin/bash 31

练习:取出ip gateway netmask

[root@web01 test]# awk -F “[ :]+” ‘{print $4,$6,$8}’ c6.txt
10.0.0.7 10.0.0.255 255.255.255.0

[root@web01 test]# awk -F “(addr:|Bcast:|Mask:)” ‘{print $2,$3,$4}’ c6.txt
10.0.0.7 10.0.0.255 255.255.255.0

[root@web01 test]# ifconfig eth0 | awk -F “[a-z,A-Z: ]+” ‘NR==2{print $2}’
10.0.0.7

awk ~ 模糊匹配 符合条件时输出
[root@web01 test]# awk -F “:” ‘$1~/root/ {print $NF}’ /etc/passwd
/bin/bash

练习:把UID大于1000的用户打印出来。

[root@oldboy ~/test]# awk -F “:” ‘$3>1000{print $1}’ /etc/passwd
oldboy
kkk
oldgirl
gongli
k1
k2
k3
oldboy1

[root@oldboy ~/test]# awk -F “:” ‘$3>1000&&$3<1005{print $1}’ /etc/passwd
#oldgirl
oldboy

练习:数学大于90的打印名字

[root@oldboy ~/test]# cat chengji.txt
姓名 语文 数学 总分
zhangsan 100 99 199
李四 88 77 165
[root@oldboy ~/test]# awk ‘$3>90{print $1}’ chengji.txt
zhangsan

[root@web01 ]# awk -F : ‘$3<10 && $NF~/bash/{print $1}’ /etc/passwd
[root@web01 ]# awk -F : ‘$3<10 && $NF~”/bin/bash”{print $1}’ /etc/passwd
[root@web01 ]# awk -F : ‘$3<10 && $NF==”/bin/bash”{print $1}’ /etc/passwd
root