[命令] Linux 命令 chmod (管理权限)

内容目录:

内容一:普通权限的管理
1.1 普通权限的介绍
1.1.1 对于文件而言
1.1.2 对于目录而言
1.1.3 用数字代替权限的方法
1.2 管理权限案例
1.2.1 给一个文件或目录添加权限的案例
1.2.1.1 案例一
1.2.1.2 案例二
1.2.1.3 案例三
1.2.1.4 案例四
1.2.2 给一个文件或目录撤销权限的案例
1.2.2.1 案例一
1.2.2.2 案例二
1.2.2.3 案例三
1.2.2.4 案例四
1.2.3 设定某一个文件或目录的权限的案例
1.2.3.1 案例一
1.2.3.2 案例二
1.2.3.3 案例三
1.2.3.4 案例四
1.2.3.5 案例五
1.2.3.6 案例六
1.2.3.7 案例七

内容二:特殊权限的管理
2.1 特殊权限 SUID
2.1.1 SUID 介绍
2.1.2 SUID 权限的添加的案例
2.1.2.1 添加 SUID 权限的案例
2.1.2.2 显示 SUID 权限的添加情况的案例
2.1.2.2.1 显示有 SUID 权限,但是所属主没有执行权限的文件的案例
2.1.2.2.2 显示有 SUID 权限,并且所属主有执行权限的文件的案例
2.2 特殊权限 SGID
2.2.1 SGID 介绍
2.2.2 SGID 权限的添加的案例
2.2.2.1 添加 SGID 权限的案例
2.2.2.2 显示 SGID 权限的添加情况的案例
2.2.2.2.1 显示有 SGID 权限,但是所属组没有执行权限的目录的案例
2.2.2.2.2 显示有 SGID 权限,并且所属组有执行权限的目录的案例
2.3 特殊权限 SBIT
2.3.1 SBIT 介绍
2.3.2 SBIT 权限的添加的案例
2.3.2.1 添加 SBIT 权限的案例
2.3.2.2 显示 SBIT 权限的添加情况的案例
2.3.2.2.1 显示有 SBIT 权限,但是所属主没有执行权限的目录的案例
2.3.2.2.2 显示有 SBIT 权限,并且所属主有执行权限的目录的案例

具体的内容:

内容一:普通权限的管理
1.1 普通权限的介绍
1.1.1 对于文件而言

1) r 代表读权限
2) w 代表写权限
3) x 代表执行权限

1.1.2 对于目录而言

1) r 代表可以看到目录
2) w 代表可以对目录进行增、删、改、查和在里面创建文件和目录
3) x 代表可以进入目录

1.1.3 用数字代替权限的方法

1) 0 代表 —
2) 1 代表 –x
3) 2 代表 -w-
4) 3 代表 -wx
5) 4 代表 r–
6) 5 代表 r-x
7) 6 代表 rw-
8) 7 代表 rwx

1.2 管理权限案例
1.2.1 给一个文件或目录添加权限的案例
1.2.1.1 案例一

# chmod u+x test.txt

(补充:这里以给 test.txt 文件的所属主添加执行权限为例)

1.2.1.2 案例二

# chmod u+r,g+w test.txt

(补充:这里以给 test.txt 文件的所属主添加执行权限,给文件的所属组添加写权限)

1.2.1.3 案例三

# chmod +x test.txt

(补充:这里以给 test.txt 文件的所属主、所属组和其他用户添加执行权限)

1.2.1.4 案例四

# chmod a+x test.txt

(补充:这里以给 test.txt 文件的所属主、所属组和其他用户添加执行权限)

1.2.2 给一个文件或目录撤销权限的案例
1.2.2.1 案例一

# chmod u-x test.txt

(补充:这里以给 test.txt 文件的所属主撤销执行权限)

1.2.2.2 案例二

# chmod u-r,g-w test.txt

(补充:这里以给 test.txt 文件的所属主撤销执行权限,给文件的所属组撤销写权限)

1.2.2.3 案例三

# chmod -x test.txt

(补充:这里以给 test.txt 文件的所属主、所属组和其他用户撤销执行权限)

1.2.2.4 案例四

# chmod a-x test.txt

(补充:这里以给 test.txt 文件的所属主、所属组和其他用户撤销执行权限)

1.2.3 设定某一个文件或目录的权限的案例
1.2.3.1 案例一

# chmod u=rwx test.txt 

(补充:这里以设置 test.txt 文件的所属主拥有读、写和执行的权限)

1.2.3.2 案例二

# chmod u=rw- test.txt

(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限)

1.2.3.3 案例三

# chmod u=--- test.txt

(补充:这里以设置 test.txt 文件的所属主没有任何权限)

1.2.3.4 案例四

# chmod u=

(补充:这里以设置 test.txt 文件的所属主没有任何权限)

1.2.3.5 案例五

# chmod u=rw,g=, test.txt

(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限。设置文件的所属组没有任何权限)

1.2.3.6 案例六

# chmod u=rw,g=---,0= test.txt

(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限。设置文件的所属组没有任何权限。设置文件的其他用户没有任何权限)

1.2.3.7 案例七

# chmod 755 test.txt

(补充:这里以设置 test.txt 文件的所属主拥有读、写和执行的权限。设置文件的所属组有读和执行的权限。设置文件的其他用户有读和执行的权限)

内容二:特殊权限的管理
2.1 特殊权限 SUID
2.1.1 SUID 介绍

1) SUID:全名 Set UID
2) SUID 的作用:让没有此文件执行权限的用户,可以执行这个文件
3) SUID 的权限数字 4000

2.1.2 SUID 权限的添加的案例
2.1.2.1 添加 SUID 权限的案例

# chmod u+s test.txt

或者:

# chmod 4644 test.txt

(补充:这里以对 test.txt 文件进行操作为例)

2.1.2.2 显示 SUID 权限的添加情况的案例
2.1.2.2.1 显示有 SUID 权限,但是所属主没有执行权限的文件的案例

# ls -l test.txt 
-rwSr--r-- 1 root root 0 12月  8 05:27 test.txt

(补充:这里以对 test.txt 文件进行操作为例)

2.1.2.2.2 显示有 SUID 权限,并且所属主有执行权限的文件的案例

# ls -l test.txt 
-rwsr--r-- 1 root root 0 12月  8 05:27 test.txt

(补充:这里以对 test.txt 文件进行操作为例)

2.2 特殊权限 SGID
2.2.1 SGID 介绍

1) SGID:全名 Set GID
2) SGID 的作用:在此目录下创建的文件,将都和此目录的所属组一样
3) SGID 的权限数字 2000

2.2.2 SGID 权限的添加的案例
2.2.2.1 添加 SGID 权限的案例

# chmod g+s test

或者:

# chmod 2644 test

(补充:这里以对 test.txt 文件进行操作为例)

2.2.2.2 显示 SGID 权限的添加情况的案例
2.2.2.2.1 显示有 SGID 权限,但是所属组没有执行权限的目录的案例

# ls -l test
-rw-r-Sr-- 1 root root 0 12月  8 05:27 test

(补充:这里以对 test.txt 文件进行操作为例)

2.2.2.2.2 显示有 SGID 权限,并且所属组有执行权限的目录的案例

# ls -l test
-rw-r-sr-- 1 root root 0 12月  8 05:27 test

(补充:这里以对 test.txt 文件进行操作为例)

2.3 特殊权限 SBIT
2.3.1 SBIT 介绍

1) SBIT:全名 Sticky Bit
2) SBIT 的作用:在此目录下创建的文件,只有创建此文件的用户和 root 用户可以删除
3) SBIT 的权限数字 1000

2.3.2 SBIT 权限的添加的案例
2.3.2.1 添加 SBIT 权限的案例

# chmod o+t test

或者:

# chmod 1644 test

(补充:这里以对 test.txt 文件进行操作为例)

2.3.2.2 显示 SBIT 权限的添加情况的案例
2.3.2.2.1 显示有 SBIT 权限,但是所属主没有执行权限的目录的案例

# ls -l test
-rw-r--r-T 1 root root 0 12月  8 05:27 test

(补充:这里以对 test.txt 文件进行操作为例)

2.3.2.2.2 显示有 SBIT 权限,并且所属主有执行权限的目录的案例

# ls -l test
-rw-r--r-t 1 root root 0 12月  8 05:27 test

(补充:这里以对 test.txt 文件进行操作为例)

[命令] Linux 命令 find (查找文件或目录)

内容目录:

内容一:find 格式

内容二:find 选项

内容三:find 参数
3.1 匹配名称的参数
3.2 匹配属性的参
3.3 匹配所有者的参数
3.4 匹配权限的参数
3.5 匹配时间的参数
3.6 匹配大小的参数
3.7 匹配目录的参数
3.8 匹配格式化方式的参数
3.9 逻辑匹配参数

内容四:find 的使用案例
4.1 案例一:匹配名称的参数
4.2 案例二:匹配属性的参
4.3 案例三:匹配所有者的参数
4.3.1 从当前目录开始查找所属主是 root 的文件和目录
4.3.2 从当前目录开始查找没有所属主和所属组的文件和目录
4.3.3 查找所有所属主是 natasha 的文件并将它们复制到 /root/findfiles 目录下
4.4 案例四:匹配权限的参数
4.4.1 从当前目录开始查找所有权限为 0777 的文件,并将其显示出来
4.4.2 从当前目录开始查找权限为 222 的文件
4.4.3 从当前目录开始查找有任何执行权限的文件和目录
4.4.4 查找所有包含特殊权限的文件和目录
4.5 案例五:匹配时间的参数
4.5.1 从当前目录开始查找 10 天内被修改过的文件
4.5.2 从 /var/log/mysql 目录开始查找在过去 3 天被修过的文件和目录,并在确认后将其删除
4.6 案例六:匹配大小的参数
4.6.1 从当前目录开始查找所有大小为 0 的文件,并将其显示出来
4.6.2 从当前目录开始查找所有大小为 0 的文件
4.7 案例七:匹配目录的参数
4.8 案例八:匹配格式化方式的参数
4.9 案例九:逻辑匹配参数
4.9.1 从当前目录开始查找以 “.txt” 结尾和以 “.dox” 结尾的文件
4.9.2 从当前目录开始查找权限不是 777 的文件
4.9.3 从当前目录开始查找权限为 2000 和 4000 的文件,并分析文件属性

具体的内容:

内容一:find 格式

# find <directory> <parameter> <parameter> ...... -print <-exec|-ok> <command|file> {<command>} \;

内容二:find 选项

1) 目录 指需要查找的目录
2) 参数 限制匹配的条件,可以有多个
3) -print 将匹配的结果进行标准输出
4) -exec 对匹配的结果执行后面的步骤
5) -ok 和 -exec 的作用相同,只不过每执行一步就需要用户确认一下
6) command 对匹配的结果执行命令
7) file 对匹配的结果进行文件种类分析,后面的 {} 里的命令必须为空
8) 命令 对匹配结果要执行的命令

(注意:<-exec|-ok> {} \;,这是一个固定格式,谁也不能被缺少。并且 {<命令>} 和 \ 之间有一个空格)

内容三:find 参数
3.1 匹配名称的参数

1) -name n 名称是 n 的文件或目录
2) -iname n 名称是 n 的文件或目录,并且忽略大小写
3) -lname n 名称是 n 的链接

(注意:在 3) 参数中,n 是被链接文件的名称而不是链接文件本身的名称)

3.2 匹配属性的参

-type n :文件类型是 n 的文件

(补充:这里的 n 可以是 d、f、l,它们分别代表目录、文件、链接)

3.3 匹配所有者的参数

1) -uid n 所属 gid 是 n 的文件或目录
2) -user n 所属主名称为 n 的文件或目录
3) -gid n 所属 gid 是 n 的文件或目录
4) -group n 所属组名称为 n 的文件或目录
5) -nouser 匹配无所属主的文件或目录
6) -nogroup 匹配无所属组的文件或目录

3.4 匹配权限的参数

1) -perm /u=n 所属主权限是 n 的文件或目录
2) -perm /u=n 所属组权限是 n 的文件或目录
3) -perm /o=n 所其他的权限是 n 的文件或目录

(补充:在以上 1) 到 3) 参数中 n 可以是 r、w、x 它们分别代表读权限、写权限、执行权限)

4) -perm -n 所属主、所属组、其他的权限是 n 的文件或目录

(补充:在 (4 参数中 n 是可以是 1、2、4)

5) -perm nnn 权限是 nnn 的文件或目录


补充:
在 5) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:600

6) -perm nnnn 权限是 nnnn 的文件或目录


补充:
在 6) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:0600

3.5 匹配时间的参数

1) -amin n 在过去 n 分钟内被读取过的文件或目录
2) -anewer file 比文件 file 更晚被读取过的文件或目录
3) -atime n 在过去 n 天内被读取过的文件或目录
4) -mmin n 在过去 n 分钟内被修改过内容的文件或目录
5) -mnewer file 比文件 file 更晚被修改过内容的文件或目录
6) -mtime n 在过去 n 天内被修改过内容的文件或目录
7) -cmin n 在过去 n 分钟内被修改过属性(比如新建)的文件或目录
8) -cnewer file 比文件 file 更晚被修改过属性(比如新建)的文件或目录
9) -ctime n 在过去 n 天内被修改过属性(比如新建)的文件或目录

(补充:在以上 1) 到 9) 参数中 n 是数字, +n 表示 n 以前,-n 表示 n 以内,n 表示第 n)

3.6 匹配大小的参数

1) -empty 为空的文件或目录
2) -size n 文件大小是 n 的文件或目录

(补充:在 2) 参数中 n 是数字, +n 表示比 n 大,-n 表示比 n 小,单位有 b、m、g 等)

3.7 匹配目录的参数

1) -path ‘n’ 路径名称符合 n 的文件或目录
2) -ipath ‘n’ 路径名称符合 n 的文件或目录,并且忽略大小写
3) -depth n 路径深度为 n 的文件或目录
4) -maxdepth n 最大路劲深度为 n 的文件或目录

(补充:在以上 1) 到 4) 参数中 n 是数字)

3.8 匹配格式化方式的参数

1) -fstype n 匹配硬盘格式为 n 文件或目录

(补充:1) 参数中 n 可以是 ext3、ext4、xfs 等硬盘格式)

2) -mount 是被挂载的文件或目录

3.9 逻辑匹配参数

1) -not 不匹配后面的参数,需要放在其他参数前面
2) ! 不匹配后面的参数,需要放在其他参数前面
3) -a 和,需要放在两个参数之前
4) -and 和,需要放在两个参数之前
5) -o 或,需要放在两个参数之前
6) -or 或,需要放在两个参数之前
7) <parameter> ( <parameter> n <parameter> ) 指定将某两个参数作为一个整体和另一个逻辑参数进行匹配
8) <parameter> -prune -n <parameter> <parameter> 指定某两个参数进行逻辑匹配

(补充:在以上 7) 到 8) 参数中 n 可以是 -a、-and、-o、-or 以上 3) 到 6) 参数)

内容四:find 的使用案例
4.1 案例一:匹配名称的参数

从当前目录开始查找以 txt 结尾的文件和目录

# find . -name "*\.txt"

4.2 案例二:匹配属性的参

从当前目录开始查找目录

# find . -type d

4.3 案例三:匹配所有者的参数
4.3.1 从当前目录开始查找所属主是 root 的文件和目录

# find . -user root

4.3.2 从当前目录开始查找没有所属主和所属组的文件和目录

# find . -nouser -o -nogroup

4.3.3 查找所有所属主是 natasha 的文件并将它们复制到 /root/findfiles 目录下

# find / -user natasha -exec cp -rp {} /root/findfiles/ \;

4.4 案例四:匹配权限的参数
4.4.1 从当前目录开始查找所有权限为 0777 的文件,并将其显示出来

# find . -type f -perm 0777 -exec ls -l {}\;

4.4.2 从当前目录开始查找权限为 222 的文件

# find . -type f -perm -2

4.4.3 从当前目录开始查找有任何执行权限的文件和目录

# find . -perm /a=x

4.4.4 查找所有包含特殊权限的文件和目录

# find / -type f \( -perm -1000 -o -perm -2000 -o -perm -4000 \) -print

4.5 案例五:匹配时间的参数
4.5.1 从当前目录开始查找 10 天内被修改过的文件

# find . -ctime -10

4.5.2 从 /var/log/mysql 目录开始查找在过去 3 天被修过的文件和目录,并在确认后将其删除

# find /var/log/mysql -type f -mtime +3 -ok rm {}\;

4.6 案例六:匹配大小的参数
4.6.1 从当前目录开始查找所有大小为 0 的文件,并将其显示出来

# find . -type f -size 0 -exec ls -l {} \;

4.6.2 从当前目录开始查找所有大小为 0 的文件

# find . -type f -empty

4.7 案例七:匹配目录的参数

从 / 目录和 /proc/ 目录开始查找文件格式为 ext3 无所属主或所属组的文件和目录

# find / -path '/proc/*' -prune -o -fstype ext3 -nouser -o -nogroup

4.8 案例八:匹配格式化方式的参数

从 \ 目录开始查找以

# find . -type f

4.9 案例九:逻辑匹配参数
4.9.1 从当前目录开始查找以 “.txt” 结尾和以 “.dox” 结尾的文件

# find . -type f \( -name "*.txt" -or -name "*.dox" \)

4.9.2 从当前目录开始查找权限不是 777 的文件

# find . -type f ! -perm 777

4.9.3 从当前目录开始查找权限为 2000 和 4000 的文件,并分析文件属性

# find . -type f \( -perm -2000 -o -perm -4000 \) -exec file {} \;

[工具] Shell 批量检测服务器 TCP 端口的联通状态 (telnet 版)

介绍:

作者:朱明宇
名称:批量检测服务器 TCP 端口的联通状态
作用:批量检测服务器 TCP 端口的联通状态,并将此服务器无法联通的端口存储到 $checklist 文件里

使用方法:
1. 将此脚本和端口清单 $portlist 文件放在同一目录下
2. 端口清单 $portlist 每一个端口占用一行,格式为:<要联通端口号对应的 IP 地址>:<要联通的端口号>:<端口功能>,并和此脚本放在同一目录下
3. 在此脚本的分割线内写入相应的内容
4. 给此脚本添加执行权限
5. 执行此脚本,并将要测试的服务器 IP 地址跟在脚本的后面,例:. <脚本名> <服务器 IP 地址 1> <服务器 IP 地址 2> ……

脚本分割线里的变量:
1. portlist=tcp_ports.txt #存放要测试的 TCP 端口的文件
2. checklist=tcp_ports_checklist.txt #存放测试结果的文件

注意:
1. 此脚本执行前必须要先保证执行本脚本的用户能无密码 ssh 远程这些远程服务器
2. 此脚本会清空 $checklist
3. 执行此脚本前确保 telnet 命令已经安装
4. 执行此脚本可能有些慢

脚本:

#!/bin/bash

####################### Separator ########################

portlist=tcp_ports.txt
checklist=tcp_ports_checklist.txt

####################### Separator ########################

echo  > $checklist
maxnum=`cat $portlist | wc -l`

for hosts in $*
do

        echo $hosts >> $checklist

        for i in `seq 1 $maxnum`
        do

                ips=`sed -n $[i]p $portlist | awk -F':' '{print $1}'`
                ports=`sed -n $[i]p $portlist | awk -F':' '{print $2}'`
                remarks=`sed -n $[i]p $portlist | awk -F':' '{print $3}'`

                ssh $hosts "(sleep 1;) | telnet $ips $ports 2>&1" | grep 'timed out' >> $checklist

                if [ $? == 0 ];then
                        echo "`sed -n $[i]p $portlist`" >> $checklist
                        echo >> $checklist
                fi

        done

        echo >> $checklist

done

[命令] Linux 命令 sed (修改和显示文件的行)

内容目录:

内容一:sed 基础
1.1 sed 的工作原理
1.2 sed 格式
1.3 sed 选项
1.4 sed 的参数

内容二:sed 使用 p 参数、P 参数、n 参数、N 参数和 = 参数显示某些行数据的案例
2.1 显示第 2 行的内容
2.2 显示第 2 行到第 4 行的内容
2.3 显示不是第 1 行的内容
2.4 显示最后 1 行的内容
2.5 显示包含 eternalcenter 的内容
2.6 显示以 eternalcenter 结尾的内容
2.7 显示包含 eternalcenter 的行的行号,并将此行的上一行的内容,本行的内容和下一行的内容显示出来
2.8 显示包含从 2000 到 2007 点行
2.9 显示从 2022-01-01 00:00:00 到 2022-02-22 00:00:00 到内容
2.10 显示总行数
2.11 显示从 2022-01-01 00:00:00 到最后的内容
2.12 以非标准输出的方式显示每 1 行是第几行,在行数后面以标准输出的方式显示行的内容,但是不显示第 1 行的内容
2.13 以非标准输出的方式显示每 1 行是第几行,在行数后面以标准输出的方式显示行的内容,但是不显示第 1 行的内容
2.14 添加行号并显示所有内容
2.15 显示奇数行
2.16 显示偶数行
2.17 显示所有行是第几行,行数后面跟行的内容
2.18 显示所有行是第几行,只显示行数
2.19 显示包含 eternalcenter 内容的行是第几行
2.20 显示所有空行是第几行
2.21 合并相同的行,也就是相同行去重

内容三:sed 使用 a 参数在某 1 行下面追加数据的案例
3.1 在第 2 行下面追加 1 行 eternalcenter
3.2 在 abc 那 1 行下面添加 1 行 eternalcenter
3.3 在 test.txt 文件里在以 a 开头的行下面添加 eternalcenter
3.4 在以 [a] 开头的行下面添加 eternalcenter
3.5 在最后 1 行下面添加 eternalcenter
3.6 在 eternalcenter 这 1 行后面添加 eternalcentre、mingyuzhu 和 zhumingyu 3 行

内容四:sed 使用 i 参数在某 1 行上面插入数据的案例
4.1 在第 2 行上面插入 1 行 eternalcenter
4.2 在 abc 那 1 行上面添加 1 行 eternalcenter
4.3 在以 a 开头的行上面添加 eternalcenter
4.4 在以 [a] 开头的行上面添加 eternalcenter
4.5 在最后 1 行上面添加 eternalcenter

内容五:sed 使用 c 参数替换某些行数据的案例
5.1 将第 2 行替换成 eternalcenter
5.2 将 abc 那 1 行替换成 eternalcenter
5.3 将以 a 开头的那 1 行替换成 eternalcenter
5.4 将以 [a] 开头的那 1 行替换成 eternalcenter
5.5 将以 eternalcentre 开头的那 1 行替换成 eternalcenter ALL=(ALL) NOPASSWD: ALL

内容六:sed 使用 d 参数删除某些行的案例
6.1 删除第 2 行
6.2 删除包含 abc 的那 1 行
6.3 删除以 a 开头的那 1 行
6.4 删除以 [a] 开头的那 1 行
6.5 删除第 2 行到第 4 行

内容七:sed 使用 s 或者 y 参数替换某些行某些数据的案例
7.1 将所有行的第一个 eternalcentre 换成 eternalcenter
7.2 将所有行的所有 eternalcentre 换成 eternalcenter
7.3 将包含 eternalcentre 的行换成 eternalcenter
7.4 将第 3 行的第 2 个 eternalcentre 换成 eternalcenter
7.5 在所有行前面添加 eternalcenter
7.6 在所有行后面添加 eternalcenter
7.7 将第 2 行替换成 eternalcenter
7.8 将最后 1 行替换成 eternalcenter
7.9 将第 2 到第 3 行替换成 eternalcenter
7.10 将 eternalcenter 前面的数据和后面的数据对调位置
7.11 所有行前后字符串互调
7.12 删除每行的第 1 个字符和最后 1 个字符
7.13 删除每行的第 2 个字符和最后 1 个字符
7.14 删除所有行的数字和空格
7.15 删除 1 行不是最后 1 行包含 eternalcenter 的行
7.16 将所有的大写字母都添加括号
7.17 在第 7 行和第 9 行前面添加 “#”
7.18 删除第 1 个空格
7.19 在以打写字母开头,中间是小写字母,以数字结尾的行里在小写字母和数字之间插入 ok
7.20 在以打写字母开头,中间是小写字母,以数字结尾的行里在小写字母和数字之间插入 ok,并将数字替换到最前面
7.21 删除 2022-01-01 字符里的横杠 “-”
7.22 将日期的年月日以空格分开
7.23 合并上下行
7.24 将以反斜杠号 “\” 结尾的行与下 1 行合并在一起并以空格进行分隔 (只合并一次)
7.25 将以反斜杠号 “\” 结尾的行与下 1 行合并在一起并以空格进行分隔 (能合并多少次就合并多少次)
7.26 若某行以 = 开头则合并到上 1 行并将等于号 “=” 替换成空格
7.27 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是 1 个 5 个字符长度的字节)
7.28 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是以 .com 结尾)
7.29 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是以空格 “ ” 结尾)

内容八:sed 使用 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数第案例
8.1 sed 的工作原理
8.2 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的讲解
8.2.1 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的作用简介
8.2.2 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的功能示意图
8.3 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的使用案例
8.3.1 将第 1 行的数据添加到第 3 行后面
8.3.2 将第 1 行的数据替换第 3 行
8.3.3 将第 1 行和第 2 行的数据添加到第 3 行后面
8.3.4 将第 1 行和第 2 行的数据替换第 3 行
8.3.5 将第 1 个以 a 开头的行的数据添加到第 3 行后面
8.3.6 将第 1 个和第 2 个以 a 开头的行的数据添加到第 3 行后面
8.3.7 将 eternalcenter 的 eternal 和 center 以空格分开

内容九:sed 一次匹配多个参数的案例

内容十:sed r 参数和 w 参数读取和写入文件
10.1 将 test2.txt 文件里的内容添加到 test1.txt 文件里内容的第3 行后面
10.2 将 test1.txt 文件里内容的第三行保存到 test2.txt 中

内容十一:sed q 参数退出当前执行的内容
11.1 执行完第 5 行后退出
11.2 执行完包含 eternalcenter 的行后退出
11.3 执行完第 3 行后退出,并将退出代码设置为 3

内容十二:sed b 参数和 t 参数设置标签分支
12.1 如果某行不包含 eternalcenter 则将此行中内容的 0 换成 1,否则将此行中内容的 0 换成 2
12.2 如果某行包含 eternalcenter 则将此行中内容的 0 换成 1,否则将此行中内容的 0 换成 2

具体的内容:

内容一:sed 基础
1.1 sed 的工作原理

1) 从第 1 行开始 1 行 1 行地读取文件里的内容
2) 每读取 1 行就将内容存入到 pattern space (模型空间) 里面
3) 在 pattern space (模型空间) 中执行 sed 命令
4) 再显示 pattern space (模型空间) 中的内容然后将其清空
5) 之后重复以上操作再开始读取文件里的下 1 行
6) pattern space (模型空间) 里的内容可以存储到 hold space 里面

1.2 sed 格式

# sed <option> <parameter> <file>

1.3 sed 选项

1) -n 或 –quiet 或 –silent 仅显示处理后的内容,没处理的内容就不显示了,也就是仅显示非标准输出的内容
2) -i 实现数据的变更
3) -e <script> 或 –expression=<script> 这样可以一次匹配多个参数
4) -r 支持扩展正则
5) -f <script file> 或 –file=<script file> 以指定的脚本文件来处理输入的文件
6) -h 或 –help 显示帮助内容
7) -V 或 –version 显示版本信息


补充:
1) pattern space (模型空间) 相当于处理内容的流水线
2) hold space (保持空间) 相当于暂时存储内容的仓库

1.4 sed 的参数

1) p 先将每行的内容以标准输出的形式显示 1 遍,再将每行的内容以非标准输出的形式再显示 1 遍。不改变是否跳过下 1 行的属性,也就是如果前面有一个 N 参数,则跳过往下第 1 行接着执行往下第 2 行,如果前面没有任何参数,则直接执行往下第 1 行
2) P 先将每行的内容以非标准输出的形式再显示 1 遍,但是如果是 2 行组合在一起的话只显示第 1 行的内容,也就是只显示分行符 “/n” 之前的内容,再将每行的内容以标准输出的形式显示 1 遍。不改变是否跳过下 1 行的属性,也就是如果前面有一个 N 参数,则跳过往下第 1 行接着执行往下第 2 行,如果前面没有任何参数,则直接执行往下第 1 行
3) n 将每行的内容以标准输出的形式显示 1 遍,并提前读取下 1 行的内容,将下 1 行的内容覆盖当前行的 pattern space (模型空间),也就是下 1 行变成了当前行,再将当前行的内容以标准输出的形式显示一遍 (如果此时得到的内容是非标准的形式则不显示)。然后跳过往下第 1 行接着执行往下第 2 行。另外,如果往下 1 行不存在则直接停止所有命令,如果当前面的条件匹配时则放弃所有后面的命令
4) N 提前预读下 1 行,将下 1 行的内容添加到本行的 pattern space (模型空间) 后面,但是本行的内容和下 1 行的内容之间依旧存在分行符 “/n”,再将当前行的内容以标准输出的形式显示一遍。然后跳过下第 1 行接着执行往下第 2 行。另外,如果下 1 行不存在则以标准的形式显示当前 pattern space (模型空间) 里的内容并直接停止所有命令,如果当前面的条件不匹配时则放弃执行 N 命令直接执行后面的命令
5) = 以非标准输出的形式显示每 1 行是第几行,在行数后面以标准输出的形式显示行的内容
6) a 在某 1 行下面追加 1 行的内容
7) i 在某 1 行上面插入 1 行的内容
8) c 替换某 1 行的内容
9) g 将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除
10) G 将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后
11) h 将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
12) H 将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后
13) d 删除 pattern space (模型空间) 中的所有行,并执行下 1 行
14) D 删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行
15) s 替换某行的某些内容
16) y 替换某行的某些内容,和 s 的作用一样,但是功能没有 s 丰富
17) x 将当前 hold space (保持空间) 和 pattern space (模型空间) 内容互换,hold space (保持空间) 用来保存临时内容, pattern space (模型空间) 是本行的内容,注意 hold space (保持空间) 和 pattern space (模型空间) 的内容互换并不改变这些内容是第几行的,例如在 pattern space (模型空间) 里的内容是第 3 行的,则需要 3p
18) r 读取某一个文件里的内容
19) w 将内容写入一个文件
20) q 退出,前面可以跟退出的条件,后面可以跟退出代码
21) b 参数,设置标签分支,如果条件不成立,则对标签的位置进行跳转,如果标签省略了,则分支会一直到末尾
22) t 参数,设置标签分支,如果条件成立,则对标签的位置进行循环跳转,直到所有可进行的操作都完成后才停止,如果标签省略了则标签分支会一直到头部。在 t 和变迁之间的步骤是会循环执行的区域


注意:
1) 当多个参数进行组合时,多次标准输出最后会合并成只显示一次
2) 当多个参数进行组合时,当一个参数后面还有参数时,产生的最后一次显示不会直接显示而是传输给下一个参数进行处理,如果此次显示是非输出的形式,传递给下一个参数处理以后也会以非输出的形式显示

内容二:sed 使用 p 参数、P 参数、n 参数、N 参数和 = 参数显示某些行数据的案例
2.1 显示第 2 行的内容

# sed -n 2p test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.2 显示第 2 行到第 4 行的内容

# sed -n 2,4p test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.3 显示不是第 1 行的内容

# sed 1!p test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.4 显示最后 1 行的内容

# sed -n '$p' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

或者:

# sed 'N;D' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.5 显示包含 eternalcenter 的内容

# sed -n '/eternalcenter/p' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.6 显示以 eternalcenter 结尾的内容

# sed -n '/eternalcenter$/p' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.7 显示包含 eternalcenter 的行的行号,并将此行的上一行的内容,本行的内容和下一行的内容显示出来

# sed -n -e '/eternalcenter/{=;x;1!p;g;$!N;p;D;}' -e h test.txt


补充:
1) 当执行到包含 eternalcenter 内容的行时
2) 执行 /eternalcenter/ 判断当前包含 eternalcenter 内容则为真,如果为真,执行 = 参数,以非标准输出的形式传输每 1 行是第几行,在行数后面以标准输出的形式传输行的内容,此时这些内容存放在 pattern space (模型空间) 中并传输给 x 参数
3) 执行 x 参数,将当前 hold space (保持空间) 和 pattern space (模型空间) 内容互换,并传输给 p 参数。在执行 x 参数前 hold space (保持空间) 里的内容是由上一行执行 h 参数时保存的,所以执行 x 参数后 pattern space (模型空间) 的内容是上一行的内容。注意 hold space (保持空间) 和 pattern space (模型空间) 的内容互换并不改变这些内容是第几行的
4) 执行 1! 判断当前行不是第 1 行则为真,如果不是第 1 行,如果执行 p 参数,将此时 pattern space (模型空间) 的内容以标准输出的形式进行显示,再将 pattern space (模型空间) 的内容以非标准输出的形式传输给 g 参数
5) 执行 g 参数,将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除,将此时的 pattern space (模型空间) 的内容传输给 N 参数
6) 执行 $! 判断当前行不是最后 1 行则为真,如果为真,执行 N 参数,将下一行的内容添加到本行内容的后面,但是两行之间存在分行符 “/n”,保存到 pattern space (模型空间),将此时的 pattern space (模型空间) 的内容以非标准输出的形式传输给 p 参数
7) 执行 p 参数,将 pattern space (模型空间) 里的内容以标准的形式显示,再将 pattern space (模型空间) 里的内容以非标准的形式传输给 D 参数
8) 执行 D 参数,删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,并将此时 pattern space (模型空间) 里的内容传输给参数 h
9) 执行 h 参数,将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
10) 这里的 test.txt 是要被 sed 操作的测试文件

2.8 显示包含从 2000 到 2007 点行

# sed -n '/2000/,/2007/p' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

(注意:test.txt 里必须要有包含 2000 内容和 2007 内容的行此命令才会生效)

2.9 显示从 2022-01-01 00:00:00 到 2022-02-22 00:00:00 的内容

# sed -n  '/2022-01-01 00:00:00/,/2022-02-22 00:00:00/p' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

(注意:test.txt 里必须要有包含 2022-01-01 00:00:00 内容和 2022-02-22 00:00:00 内容的行此命令才会生效)

2.10 显示从 2022-01-01 00:00:00 到最后的内容

# sed '/2019-01-01/,$' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

(注意:test.txt 里必须要有包含 2019-01-01 内容的行此命令才会生效)

2.11 显示总行数

# sed -n $= test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.12 以非标准输出的方式显示每 1 行是第几行,在行数后面以标准输出的方式显示行的内容,但是不显示第 1 行的内容

# sed -n '{=;1!p}' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.13 以非标准输出的方式显示每 1 行是第几行,在行数后面以标准输出的方式显示行的内容,但是不显示第 1 行的内容

# sed -n '{=;2!p}' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.14 添加行号并显示所有内容

# sed = test.txt | sed 'N;s/\n/:/'

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.15 显示奇数行

# sed -n 'p;n' test.txt


补充:
1) 执行第 1 行,执行 p 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容以非标准输出的形式传输给 n 参数,再执行 n 参数,将第 1 行的内容以标准输出的形式进行显示 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里变为以非标准的形式进行显示),再将第 1 行的内容被第 2 行的内容覆盖,再将第 1 行的内容以标准输出的形式显示 1 遍 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里不再进行显示),再跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
2) 执行第 3 行,执行 p 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容以非标准输出的形式传输给 n 参数,再执行 n 参数,将第 3 行的内容以标准输出的形式进行显示 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里变为以非标准的形式进行显示),再将第 3 行的内容被第 4 行的内容覆盖,再将第 1 行的内容以标准输出的形式显示 1 遍 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里不再进行显示),再跳过第 4 行再直接执行第 5 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 以此类推
4) 当执行到最后 1 行时,按照之前的逻辑,如果是奇数行则显示当前行的内容,如果是偶数行则跳过
5) 这里的 test.txt 是要被 sed 操作的测试文件

或者:

# sed -n '$!N;P' test.txt


补充:
1) $! 作用是判断当前行不是最后 1 行时执行后面的命令
2) 执行第 1 行,执行 $! 判断当前行不是最后 1 行则为真,第 1 行不是最后 1 行,执行 N 命令,将第 2 行的内容添加到第 1 行的内容的后面,但是第 1 行和第 2 行之间存在分行符 “/n”,再将当前行的内容以标准输出的形式传输给 P 参数,再执行 P 命令,将此时第 1 行的内容以标准输出的形式进行显示,再将分行符 “/n” 之前的所有内容 (也就是最早是第 1 行的内容) 以非标准输出的形式显示出来,并跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 执行第 3 行,执行 $! 判断当前行不是最后 3 行则为真,第 3 行不是最后 1 行,执行 N 命令,将第 4 行的内容添加到第 3 行的内容的后面,但是第 3 行和第 4 行之间存在分行符 “/n”,再将当前行的内容以标准输出的形式传输给 P 参数,再执行 P 命令,将此时第 3 行的内容以标准输出的形式进行显示,再将分行符 “/n” 之前的所有内容 (也就是最早是第 3 行的内容) 以非标准输出的形式显示出来,并跳过第 3 行再直接执行第 4 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
4) 以此类推
5) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
6) 这里的 test.txt 是要被 sed 操作的测试文件

或者:

# sed 'n;d' test.txt


补充:
1) 执行第 1 行,执行 n 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容被第 2 行的内容替代,再将被替代的内容传输给 d 参数,再执行 d 参数将第 2 行的内容删除掉。并跳过第 2 行直接执行第 3 行
2) 执行第 3 行,执行 n 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容被第 4 行的内容替代,再将被替代的内容传输给 d 参数,再执行 d 参数将第 4 行的内容删除掉。并跳过第 4 行直接执行第 5 行
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件

2.16 显示偶数行

# sed -n 'n;p' test.txt


补充:
1) 执行第 1 行,执行 n 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容被第 2 行的内容替代,再将被替代的内容传输给 p 参数,再执行 p 参数,将第 2 行的内容以标准的形式显示,再将第 2 行的内容以非标准的形式显示。并跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
2) 执行第 3 行,执行 n 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容被第 4 行的内容替代,再将被替代的内容传输给 p 参数,再执行 p 参数,将第 4 行的内容以标准的形式显示,再将第 4 行的内容以非标准的形式显示。并跳过第 4 行再直接执行第 5 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件

2.17 显示所有行是第几行,行数后面跟行的内容

# sed = test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.18 显示所有行是第几行,只显示行数

# sed -n test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.19 显示包含 eternalcenter 内容的行是第几行

# sed -n '/eternalcenter/=' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.20 显示所有空行是第几行

# sed -n '/^$/=' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

2.21 合并相同的行,也就是相同行去重

# sort test.txt | sed '$!N;/^\(.*\)\n\1$/!P;D'

(
补充:
1) 执行 sort 将所有的行进行排序将相同的行排在一起,并结果输出给 sed
2) 执行第 1 行,执行 $! 判断当前行不是最后 1 行则为真,第 1 行不是最后 1 行,执行 N 参数,将第 2 行的内容添加到第 1 行的内容的后面,但是第 1 行和第 2 行之间存在分行符 “/n”,再将组合后的内容传输给 P 参数,再执行 /^(.*)\n\1$/! 判断当前行 \n 前面和后面不一样则为真,当为假时则直接不执行将内容传输给 D 参数,当为真时,执行 P 参数,先将第 1 行的内容以非标准输出的形式显示一遍,但是如果是 2 行组合在一起的话只显示第 1 行的内容,也就是只显示分行符 “/n” 之前的内容,再将第 1 行的内容以标准输出的形式传输给 D 参数,执行 D 参数,删除内容中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行第 2 行,如果删除后没有内容了,则跳过第 2 行直接执行第 3 行
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件
)

内容三:sed 使用 a 参数在某 1 行下面追加数据的案例
3.1 在第 2 行下面追加 1 行 eternalcenter

# sed "2a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

3.2 在 abc 那 1 行下面添加 1 行 eternalcenter

# sed "/abc/a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

3.3 在 test.txt 文件里在以 a 开头的行下面添加 eternalcenter

# sed "/^a/a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

3.4 在以 [a] 开头的行下面添加 eternalcenter

# sed "/^\[a\]/a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

3.5 在最后 1 行下面添加 eternalcenter

# sed "$a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

3.6 在 eternalcenter 这 1 行后面添加 eternalcentre、mingyuzhu 和 zhumingyu 3 行

# sed '/eternalcenter/a eternalcentre\nmingyuzhu\nzhumingyu' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容四:sed 使用 i 参数在某 1 行上面插入数据的案例
4.1 在第 2 行上面插入 1 行 eternalcenter

# sed "2i eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

4.2 在 abc 那 1 行上面添加 1 行 eternalcenter

# sed "/abc/i eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

4.3 在以 a 开头的行上面添加 eternalcenter

# sed "/^a/i eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

4.4 在以 [a] 开头的行上面添加 eternalcenter

# sed "/^\[a\]/i eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

4.5 在最后 1 行上面添加 eternalcenter

# sed "$a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容五:sed 使用 c 参数替换某些行数据的案例
5.1 将第 2 行替换成 eternalcenter

# sed "2c\ eternalcenter" test.txt

或者:

# sed "2ceternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

5.2 将 abc 那 1 行替换成 eternalcenter

# sed "/abc/c\ eternalcenter" test.txt

或者:

# sed "/abc/ceternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

5.3 将以 a 开头的那 1 行替换成 eternalcenter

# sed "/^a/c\ eternalcenter" test.txt

或者:

# sed "/^a/ceternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

5.4 将以 [a] 开头的那 1 行替换成 eternalcenter

# sed "/^\[a\]/c\ eternalcenter" test.txt

或者:

# sed "/^\[a\]/ceternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

5.5 将以 eternalcentre 开头的那 1 行替换成 eternalcenter ALL=(ALL) NOPASSWD: ALL

# sed "/^eternalcentre/c\ eternalcenter\ ALL=\(ALL\)\ NOPASSWD:\ ALL" test.txt

或者:

# sed "/^eternalcentre/c\eternalcenter\ ALL=\(ALL\)\ NOPASSWD:\ ALL" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容六:sed 使用 d 参数删除某些行的案例
6.1 删除第 2 行

# sed 2d test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

6.2 删除包含 abc 的那 1 行

# sed /"abc"/d test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

6.3 删除以 a 开头的那 1 行

# sed /"^a"/d test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

6.4 删除以 [a] 开头的那 1 行

# sed /"^\[a\]"/d test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

6.5 删除第 2 行到第 4 行

# sed '2,4d' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容七:sed 使用 s 或者 y 参数替换某些行某些数据的案例
7.1 将所有行的第一个 eternalcentre 换成 eternalcenter

# sed 's/eternalcentre/eternalcneter/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.2 将所有行的所有 eternalcentre 换成 eternalcenter

# sed 's/eternalcentre/eternalcneter/g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.3 将包含 eternalcentre 的行换成 eternalcenter

# sed 's/.*eternalcentre.*/eternalcneter/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.4 将第 3 行的第 2 个 eternalcentre 换成 eternalcenter

# sed '3s/eternalcentre/eternalcenter/2' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.5 在所有行前面添加 eternalcenter

# sed 's/^/eternalcenter/g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

或者:

# sed 's/^/eternalcenter&/g test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.6 在所有行后面添加 eternalcenter

# sed 's/$/eternalcenter/g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

或者:

# s/$/&eternalcenter/g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.7 将第 2 行替换成 eternalcenter

# sed '2s/.*/eternalcenter/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.8 将最后 1 行替换成 eternalcenter

# sed '$s/.*/eternalcenter/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.9 将第 2 到第 3 行替换成 eternalcenter

# sed '2,3s/.*/eternalcenter/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.10 将 eternalcenter 前面的数据和后面的数据对调位置

# sed "s/^\(.*\)\(eternalcenter\)\(.*\)$/\3\2\1/" test.txt

或者:

# sed -r "s/(.*)(eternalcenter)(.*)/\3\2\1/" test.txt

或者:

# sed -r "s/(.*)((eternal)(center))(.*)/\5\2\1/" test.txt

(补充:这里以 (.*) 是 1,((eternal)(center)) 是 2,(eternal) 是 3,(center) 是 4,(.*) 是 5 为例,这里的 test.txt 是要被 sed 操作的测试文件)

7.11 所有行前后字符串互调

# sed -r 's/.*/&\n/g;:a;s/(.*)(.)\n(.*)/\1\n\3\2/g;ta;s/^\n//g' test.txt


补充:
1) 执行 s/.*/&\n/g 在每行行尾添加换行符 “\n”
2) 执行 a 参数和 ta 参数,将从 :a 到 ta 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 s/(.*)(.)\n(.*)/\1\n\3\2/g,将此时所有行换行符 “\n” 之前的内容里最后一个字母移动到所有行换行符 “\n” 之后到内容里最后一个位置
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件

或者:

# sed -r 's/.*/&\n/g;:b;s/(.*)(.)\n(.*)/\1\n\3\2/g;tb;s/^\n//g' test.txt


补充:
1) 执行 s/.*/&\n/g 在每行行尾添加换行符 “\n”
2) 执行 b 参数和 tb 参数,将从 :b 到 tb 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 s/(.*)(.)\n(.*)/\1\n\3\2/g,将此时所有行换行符 “\n” 之前的内容里最后一个字母移动到所有行换行符 “\n” 之后到内容里最后一个位置
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件

7.12 删除每行的第 1 个字符和最后 1 个字符

# sed 's/.//1;s/.$//' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.13 删除每行的第 2 个字符和最后 1 个字符

# sed 's/.//2;s/.$//' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.14 删除所有行的数字和空格

# sed -r 's/[0-9]//g;s/^( )+//g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.15 删除 1 行不是最后 1 行包含 eternalcenter 的行

# sed '/eternalcenter/N;s/.*\n//' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.16 将所有的大写字母都添加括号

# sed 's/[A-Z]/(&)/g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.17 在第 7 行和第 9 行前面添加 “#”

# sed '7,9s/^/#/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.18 删除第 1 个空格

# sed -r 's/( )(.*)/\2/'

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.19 在以打写字母开头,中间是小写字母,以数字结尾的行里在小写字母和数字之间插入 ok

# sed -r 's/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/\1\2ok\3/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.20 在以打写字母开头,中间是小写字母,以数字结尾的行里在小写字母和数字之间插入 ok,并将数字替换到最前面

# sed -r 's/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/\3 ok \1\2/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.21 删除 2022-01-01 字符里的横杠 “-”

# sed -r 's/([0-9]{1,})\-([0-9]{1,})\-([0-9]{1,})/\1\2\3/' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.22 将日期的年月日以空格分开

# echo 20220222 | sed -r 's/(....)(..)(..)/\1 \2 \3/'

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.23 合并上下行

# sed '$!N;s/\n/ /' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.24 将以反斜杠号 “\” 结尾的行与下 1 行合并在一起并以空格进行分隔 (只合并一次)

# sed '/\\$/N;s/\\\n/ /' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.25 将以反斜杠号 “\” 结尾的行与下 1 行合并在一起并以空格进行分隔 (能合并多少次就合并多少次)

# sed -e :a -e '/\\$/N;s/\\\n/ /; ta' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

7.26 若某行以 = 开头则合并到上 1 行并将等于号 “=” 替换成空格

# sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' num.txt 


补充:
1) 执行 :a 参数和 ta 参数,将从 :a 到 ta 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 $!N;s/\n=/ /,当不是最后 1 行时,将下 1 行的内容添加到本行后面,但是本行的内容和下 1 行的内容之间依旧存在分行符 “/n”,如果此时存在 \n=,则将其替换成空格,再将最后的结果以非标准输出的方式传输给 P 参数,执行 P 参数,将分行符 “/n” 之前的所有内容 (也就是最初此行的内容) 以非标准输出的形式显示,再将此时的所有内容以非标准输出的形式传输给 D 参数,执行 D 参数,删除前 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行,否则跳过往下第 1 行接着执行往下第 2 行
2) 以此类推
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件

7.27 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是 1 个 5 个字符长度的字节)

# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.....\).*\n\1.*/s/^\(.*\)\(\n\)\(.....\)\(.*\)/\1\4/g; ta'

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

7.28 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是以 .com 结尾)

# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\.com\).*\n\1.*/s/^\(.*\)\(\n\)\(.*\.com\)\(.*\)/\1\4/g; ta'

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

7.29 行列转换,并且将第 1 行相同的列,行列转换以后合并,也就是行列转换以后没有第 1 列相互重复的行 (指定 1 列是以空格 “ ” 结尾)

# > awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\ \).*\n\1.*/s/^\(.*\)\(\n\)\(.*\ \)\(.*\)/\1 \4/g; ta'

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

内容八:sed 使用 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数第案例
8.1 sed 的工作原理

1) 从第 1 行开始 1 行 1 行地读取文件里的内容
2) 每读取 1 行就将内容存入到 pattern space (模型空间) 里面
3) 在 pattern space (模型空间) 中执行 sed 命令
4) 再显示 pattern space (模型空间) 中的内容然后将其清空
5) 之后重复以上操作再开始读取文件里的下 1 行
6) pattern space (模型空间) 里的内容可以存储到 hold space (保持空间) 里面


补充:
1) pattern space (模型空间) 相当于处理内容的流水线
2) hold space (保持空间) 相当于暂时存储内容的仓库

8.2 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的讲解
8.2.1 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的作用简介

1) g 将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除
2) G 将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后
3) h 将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
4) H 将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后
5) d 删除 pattern space (模型空间) 中的所有行,并执行下 1 行
6) D 删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行

8.2.2 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的功能示意图

P H     P H     P H
1    h  1 1  d    1

P H     P H     P H     P H
2 1  G  2 1  H  2 1  d    1
        1       1 2       2
                  1       1

P H     P H     P H
3 2  G  3 2  h  3 3
  1     2 1     2 2
        1       1 1

P H     P H
3 2  g  2 2
  1     1 1


补充:
1) 这里的 P 指的是 pattern space (模型空间)
2) 这里的 H 指的是 hold space (保持空间)
3) h 其实就是清空现在粘贴板里的内容然后重新复制
4) H 其实就是不清空现在粘贴板里的内容然后再再原来粘贴版的内容基础上再追加复制
5) g 其实就是替换粘贴
6) G 其实就是追加粘贴

8.3 h 参数、H 参数、g 参数、G 参数、d 参数、D 参数的使用案例
8.3.1 将第 1 行的数据添加到第 3 行后面

# sed -e '1h' -e '3G' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.2 将第 1 行的数据替换第 3 行

# sed -e '1h' -e '3g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.3 将第 1 行和第 2 行的数据添加到第 3 行后面

# sed -e '1h' -e '2H' -e '3G' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.4 将第 1 行和第 2 行的数据替换第 3 行

# sed -e '1h' -e '2H' -e '3g' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.5 将第 1 个以 a 开头的行的数据添加到第 3 行后面

# sed -e '/^a/h' -e '3G' 1.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.6 将第 1 个和第 2 个以 a 开头的行的数据添加到第 3 行后面

# sed -e '/^a/h' -e'/^a/H' -e '3G' 1.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

8.3.7 将 eternalcenter 的 eternal 和 center 以空格分开

# echo "eternalcenter" | sed -r 'H;s/(.{7}).*/\1/;x;s/.*(.{6})$/\1/;x;G;s/\n/ /'

(
1) 执行 H 参数,将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 s 参数
2) 执行 s/(.{7})./\1/,将 pattern space (模型空间) 中的内容只保留前 7 个字符,并将此时的 pattern space (模型空间) 传输给 x 参数 3) 执行 x 参数,将 hold space (保持空间) 和 pattern space (模型空间) 内容互换,,并将此时的 pattern space (模型空间) 传输给 s 参数 4) 执行 s/.(.{6})$/\1/,将 pattern space (模型空间) 中的内容只保留后 6 个字符,并将此时的 pattern space (模型空间) 传输给 x 参数
5) 执行 x 参数,将 hold space (保持空间) 和 pattern space (模型空间) 内容互换,,并将此时的 pattern space (模型空间) 传输给 G 参数
6) 执行 G 参数,将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 s 参数
7) 执行 s/(.{7}).*/\1/,将 pattern space (模型空间) 中的内容删除换行符 “\n”
)

内容九:sed 一次匹配多个参数的案例

在 abc 和 bbb 那两行下面添加 1 行 eternalcenter

# sed -e "/abc/a eternalcenter" -e "/^bbb/a eternalcenter" test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容十:sed r 参数和 w 参数读取和写入文件
10.1 将 test2.txt 文件里的内容添加到 test1.txt 文件里内容的第3 行后面

# sed '3r test2.txt' test1.txt

(补充:这里的 test1.txt 和 test2.txt 是要被 sed 操作的测试文件)

10.2 将 test1.txt 文件里内容的第三行保存到 test2.txt 中

# sed '3w test2.txt' test1.txt

(补充:这里的 test1.txt 和 test2.txt 是要被 sed 操作的测试文件)

内容十一:sed q 参数退出当前执行的内容
11.1 执行完第 5 行后退出

# sed '5 q' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

11.2 执行完包含 eternalcenter 的行后退出

# sed '/eternalcenter/ q' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

11.3 执行完第 3 行后退出,并将退出代码设置为 3

# sed '3 q 3' test.txt

(补充:这里的 test.txt 是要被 sed 操作的测试文件)

内容十二:sed b 参数和 t 参数设置标签分支
12.1 如果某行不包含 eternalcenter 则将此行中内容的 0 换成 1,否则将此行中内容的 0 换成 2

# sed '{/eternalcenter/b lable;s/0/1/;:lable}' test.txt


补充:
1) 在这里 lable 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件

或者:

# sed '/eternalcenter/ba;s/0/1/;b;:a' test.txt


补充:
1) 在这里 a 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件

12.2 如果某行包含 eternalcenter 则将此行中内容的 0 换成 1,否则将此行中内容的 0 换成 2

# sed '/eternalcenter/s/0/1/;t;s/0/2/' test.txt


补充:
1) 在这里的标签省略了,所以标签分支会一直到头部
2) 这里的 test.txt 是要被 sed 操作的测试文件

或者:

# sed -e :a -e '/eternalcenter/s/0/1/;ta;s/0/2/' test.txt


补充:
1) 在这里 a 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件

[命令] Linux 命令 grep (显示文本的行)

案例一:grep 使用正则表达式匹配

# grep -E '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

或者:

# egrep '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行为例)

案例二:grep 显示行号
2.1 显示某些关键字所在行行号

# egrep -n '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并显示行号为例)

2.2 显示哪些行号是空行

# egrep -n ^$ /etc/resolv.conf

(补充:这里以匹配 /etc/resolv.conf 里的空行并显示行号为例)

案例三:grep 取反匹配
3.1 取反不匹配某些关键字

# egrep -v '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里不含有 IP 地址的行并显示行号为例)

3.2 取反不显示空行

# egrep -v ^$ /etc/resolve.conf

(补充:这里以匹配 /etc/resolve.conf 文件里不为空的行为例)

3.3 取反不显示以井号 “#” 开头的行

# grep '^[^#]' /etc/resolve.conf

(补充:这里以匹配 /etc/resolve.conf 文件里不以井号 “#” 开头的行为例)

3.4 取反不显示以井号 “#” 或空格 “ ” 开头的行

# grep '^[^#| ]' /etc/resolve.conf

(补充:这里以匹配 /etc/resolve.conf 文件里不以井号 “#” 和空格 “ ” 开头的行为例)

案例四:grep 只显示匹配的部分

# egrep -o '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 里的 IP 地址为例)

(注意:这里匹配后只显示 IP 地址,而不显示 IP 地址所在行里的其他内容)

案例五:grep 匹配时忽略大小写

# egrep -i '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并忽略大小写为例)

案例六:grep 统计匹配成功次数

# egrep -c '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行的数量为例)

案例七:grep 将匹配成功的部分自动添加颜色

# egrep --color=auto '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并自动添加颜色为例)

案例八:grep 将匹配成功的部分自动取消颜色

# egrep --color=no '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192  

(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并取消自动添加颜色为例)

案例九:grep 一次匹配多个参数

# grep -e root -e zhumingyu /etc/passwd

(补充:这里以匹配 /etc/passwd 文件中包含 root 或 zhumingyu 的行为例)

案例十:显示匹配内容附近的内容
10.1 显示匹配内容的前 10 行

# grep -a 10 eternalcenter test.txt

(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其前 10 行为例)

10.2 显示匹配内容的后 10 行

# grep -b 10 eternalcenter test.txt

(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其后 10 行为例)

10.3 显示匹配内容的前后 10 行

# grep -a -b 10 eternalcenter test.txt

(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其前后 10 行为例)