20.文件权限--文件权限:
1.文件属性信息详细说明--文件权限
1) 文件数据权限有什么:
r read --- 读权限 4
w write --- 写权限 2
x execute --- 执行权限 1
- --- 没有权限 0
2) 权限赋予到指定人
属主信息 文件所有者(监护人) 权限
属组信息 文件所有者(亲人) 权限
其他用户 隔壁老王 权限
这个文件权限是644权限:
属主 属组 其他用户
r(4)w(2)-(0)=6 r(4)--=4 r(4)--=4
练习:
rwx -- 7
rw--w---x 621
rwx-wx--- 730
432 r---wx-w-
2.文件属性信息详细说明---用户信息(属主 属组)
1) 系统中用户信息有什么用
a 利用用户登录系统
b 利用用户管理数据 # 比如复制移动修改删除
c 利用用户管理进程 # 杀死进程
2) 系统如何识别不同的用户
利用用户的数值编号进行识别: uid
[root@oldboyedu ~]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@oldboyedu ~]# id oldboy
uid=1000(oldboy) gid=1000(oldboy) groups=1000(oldboy)
3) 用户组的概念: # 通过一个组来为多个用户赋予同样的权限
oldboy oldgirl olddog(一个组) -sa(system admin) /sa --rwx
boy gril dog(一个组) -dev(Development) /dev --rwx
alex old (一个组) -dba(database admin) /dba --rwx
用户和用户组的关系:
用户 -- 用户组 1v1
多个用户 -- 用户组 多v1
用户 -- 多个用户组 1v多
系统识别用户组也是根据编号识别: gid
[root@oldboyedu ~]# id root
uid=0(root) gid=0(root) groups=0(root)
01 02 03
01. 显示用户名和uid对应关系
02. 显示属于的用户组,以及组名和gid对应关系
03. 用户可能属于哪些组
4) 用户进行分类
a 超级管理员用户 皇帝 root
uid信息进行区分: 0
从权限上区分: 至高无上
b 虚拟用户 傀儡 xxx nobody
uid信息进行区分: 1-999 centos7
从权限上区分: 管理进程 不能登录系统/没有家目录
c 普通用户 平民 oldboy oldgirl
uid信息进行区分: 1000+ centos7
从权限上区分: 管理指定数据 可以管理指定进程 可以登录系统/有家目录
centos6: 虚拟用户1-499 普通用户从500-65535 root 0
centos7: 虚拟用户1-999 普通用户从1000-65535 root 0
如何保护好皇帝:
01. 修改远程连接端口-52113 --- 修改/etc/ssh/sshd_config
02. 禁止root用户远程登录 --- 修改/etc/ssh/sshd_config
root --- 密码破解
1. 系统中有什么普通用户?
2. 普通用户密码?
3. su - root root用户密码
满足什么条件可以以root身份登录系统:
01. 服务器地址信息 14.215.177.38
02. 服务器端口信息 22 # 只能改端口 /etc/ssh/sshd_config port值
03. 登录用户信息 root
04. 登录用户的密码 rsdasd 暴力破解
理工大学:
01. 这个网站还没有被攻击下来
02. 网站已经被攻击了,但没被发现
3. 文件属性信息详细说明---inode
inode: 索引节点
文件或数据在磁盘中保存位置 # 地址,以及关于文件属性信息
block: 索引节点指向的位置 # 地址对应的内容
文件或数据的具体内容
读取数据的原理
01. 找到指定数据
02. 读取数据内容,先获取文件数据inode信息
03. 根据inode信息在磁盘上找到对应block
04. 根据block信息获取文件真正内容
4.文件属性信息详细说明--时间信息(改变时间)
[root@lala ~]# stat a.txt
File: 'a.txt'
Device: fd00h/64768d Inode: 11465360 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-05-05 15:54:46.434422719 +0800
Modify: 2020-05-04 22:21:34.905060738 +0800
Change: 2020-05-04 22:21:34.908060738 +0800
文件数据时间类型:
01. 访问时间 Access time == atime
02. 修改时间 Modify time == mtime
03. 改变时间 Change time == ctime --- 数据属性信息(大小权限)发生改变了
5.内容回顾
1) find命令使用方法
a 根据文件名称类型进行查找
b 根据文件大小进行查找 -size +1M/-1M/1M
c 根据目录层级查找文件 -maxdepth 1 -mindepth
d 根据文件权限查找数据 -perm
[root@oldboyedu oldboy]# find /oldboy -maxdepth 1 -type f -perm 644
2) tar命令压缩数据
如何压缩数据:
tar zcvf /tmp/oldboy.tar.gz /etc/ /oldboy/ /oldboy/oldboy.txt
如何解压数据:
tar xf /tmp/oldboy.tar.gz -C /oldboy # -C 指定解压目录
如何查看压缩包:
tar tf /tmp/oldboy.tar.gz # t=list
排除文件方法:
--exclude 一个,路径类型必须相同(绝对/相对)
--exclude-from 多个,从文件读取
3) 文件属性信息 -- 权限信息
4) 文件属性信息 -- 用户信息 (超级用户 虚拟用户 普通用户)
5) 文件属性信息 -- 时间信息 (atime mtime ctime)
补充:
ctrl + r:
快读搜索历史命令
xargs:
[root@lala ~/dockerfile/n1]# xargs -n 3 < a.txt
./text1.txt ./text2.txt ./text3.txt
./text4.txt ./text5.txt ./text6.txt
./a.txt
作业:
1.如何将一个目录所有.txt查找出来并压缩?
find /temp -type f -name "*.txt" | xargs tar -zcvf /temp/txt.tar.gz \;
tar -zcvf /temp/txt.tar.gz `find /temp -type f -name "*.txt"`
2.如何将一个目录所有.txt查找出来并删除?
find /temp -type f -name "*.txt" -delete
find /temp -type -f -name "*.txt" -exec rm -rf {} \; # \代表转义 ;代表多个命令分隔
find /temp -type f -name "*.txt" | xargs rm -rf # xrags将多行变成一行
rm -rf `find /temp -type f -name '*.txt'`
3.如何将一个目录所有.txt查找出来并移动到/temp目录?
find /temp -type f -name "*.txt" -exec cp {} /temp \;
4.centos6中如何使用uid区分不同的用户类型?
root 0 虚拟用户 1-499 普通用户 500-65535
21.文件属性信息--inode:
1.inode
找索引节点
一份努力 一份收获
inode -- 索引节点
概述:
相当于书目录
用于存储文件属性信息
诞生出来:
创建文件系统之后就有了相应的inode
磁盘操作处理过程: 地皮
磁盘 地皮
raid 将多块地连接起来
分区 将地皮进行规划
格式化 地皮进行打扫整理
创建文件系统 建房风格 inode和block
挂载 安装门
特点说明:
inode用于存放的是文件属性
inode用于存放块的指针位置 ???
创建一个文件至少占用一个inode和一个block
在同一分区中,两个文件的inode号码相同,两个文件互为硬链接 ???
查看方法:
[root@oldboyedu oldboy]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 25587200 61342 25525858 1% /
2.block
block -- 数据块
概述:
目录指向的内容
用于存储文件具体内容
诞生出来:
创建文件系统之后
特点说明:
block用于存放的是数据信息
block默认大小为4k,可以进行调整
比较大的文件,会占用多个block
比较小的文件,剩余空间无法使用, 浪费磁盘空间
创建一个文件至少占用一个inode和一个block(非空文件)
磁盘读取数据按block为单位读取的
读取一个block会消耗一次磁盘I/O(input/output 磁盘读写)
# 企业中面试: 你都做过哪些系统优化操作?
问题: block默认大小可以调整 是大点好 小点好(block越多io消耗越大)
设置大点: 10k 视频公司 图片公司
文件大的时候: 20K 4k -- 2个block 2s(处理一个block2s) 4s(block变大之后还是2s) --- 节省IO消耗
设置小点: 2k 互联网公司
小文件的时候: 1k 2k -- 1个block --- 提高磁盘利用率
查看方法:
[root@oldboyedu oldboy]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 51149416 1752080 49397336 4% /
补充:
01. 文件属性信息存储在inode中
02. 文件的名称信息存储在上一级目录的block中
作业:
1.如何查看系统的block?
[root@lala ~/dockerfile/n1]# stat /boot/ |grep 'IO Block'
Size: 4096 Blocks: 8 IO Block: 4096 directory
2.如何修改系统的block?
https://blog.csdn.net/Freshair_x/article/details/80169121
3. 如何修改磁盘中block大小 如何进行查看默认的block大小?
4. 总结数据存储与读取原理 ?
5. 磁盘满无法存储数据的原因 ?
6. linux系统中读取数据的原理(数据无法读取-权限阻止) 权限章节?
/oldboy/oldboy01/oldboy.txt
7. 总结英文月份信息 星期信息?
8. 如何将文件彻底删除?
1.硬链接数为零
2.确保没有进程占用文件
22.文件属性--连接:
1.硬链接
硬链接:
概念说明: 超市的多个门 ??? 在一个分区中,inode号码相同的文件,互为硬链接
诞生过程:
ln 链接的源文件 硬链接的文件信息
[root@oldboyedu oldboy]# ln /oldboy/oldboy.txt /oldboy/oldboy_hard_link.txt
[root@oldboyedu oldboy]# ll
total 8
-rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy_hard_link.txt
-rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy.txt
利用find命令找到有多硬链接文件
[root@oldboyedu oldboy]# find / -type f -inum 33584339
/etc/hosts
/tmp/hosts
# 系统中的目录不能创建硬链接
统计目录下子目录数
[root@oldboyedu ~]# ll /etc/|grep -c "^d"
78
[root@oldboyedu ~]# ll /etc/|grep "^d"|wc -l
78
2.软连接
概念说明: 文件的快捷方式
诞生过程: 建议使用绝对路径创建
ln -s 链接的源文件 软链接的文件信息
[root@oldboyedu oldboy]# ln -s /oldboy/oldboy.txt /oldboy/oldboy_soft_link.txt
[root@oldboyedu oldboy]# ll
total 8
lrwxrwxrwx. 1 root root 18 Apr 16 10:50 oldboy_soft_link.txt -> /oldboy/oldboy.txt
-rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy.txt
软硬链接的区别:
01. 链接后的文件大小不一致
02. 链接后的文件类型和权限不一致(颜色不一致)
03. 链接后的文件和源文件 inode信息有出入
硬链接inode号码一致
软链接inode号码不一样
04. 源文件被删除之后
硬链接文件依然有效
软链接文件失效
05. 软硬链接创建过程不一致
3.时间相关命令
时间相关的命令 date
01. 查看时间信息:
[root@oldboyedu ~]# date
Tue Apr 16 11:49:51 CST 2019
02. 调整时间显示格式
[root@oldboyedu ~]# date +%F
2019-04-16
[root@oldboyedu ~]# date "+%F %T"
2019-04-16 11:52:54
[root@oldboyedu ~]# date "+%y-%m-%d %H:%M:%S"
19-04-16 11:53:58
cp oldboy.log oldboy.log-$(date "+%F_%T") # 创建时间备份文件
cp oldboy.log oldboy.log-`date "+%F-%T"`
显示历史时间信息:
# date +%F -d "-2day"
# date +%F -d "1 day ago"
显示未来时间信息:
# date -d "+2day"
# date -d "2day"
系统自动的备份数据 00:00 4月16日 -- 4月17日 00:00
cp /oldboy/oldboy.log /log/oldboy.log.$(date +%F)
调整:
cp /oldboy/oldboy.log /log/oldboy.log.$(date +%F -d "-1day")
03. 如何实际修改系统时间
[root@oldboyedu oldboy]# date -s "2020-04-17"
Fri Apr 17 00:00:00 CST 2020
[root@oldboyedu oldboy]# date
Fri Apr 17 00:00:17 CST 2020
[root@oldboyedu oldboy]# date -s "2020/04/17 14:00"
Fri Apr 17 14:00:00 CST 2020
04. 时间同步方法
yum install -y ntpdate
ntpdate
[root@oldboyedu oldboy]# ntpdate ntp1.aliyun.com
16 Apr 12:22:33 ntpdate[25718]: step time server 120.25.115.20 offset 268748517.381960 sec
[root@oldboyedu oldboy]# date
Tue Apr 16 12:22:48 CST 2019
备注:
01防止文件误删除做法?
1.创建硬链接(可以解决误删除,不能防止误修改)
2.创建备份文件(可以解决误修改)
回顾:
文件属性章节:
ll -i /etc/hosts
33584339 -rw-r--r--. 2 root root 192 Apr 15 2019 /etc/hosts
1) inode信息:
inode是什么?
作用概述: 索引节点/存储文件属性信息
诞生过程: 磁盘格式化=创建文件系统
特点说明: inode号码相同,互为硬链接
block是什么?
作用概述: 数据块/存储文件具体内容
诞生过程: 磁盘格式化=创建文件系统
特点说明: 根据企业情况,调整block大小
企业面试题: 系统中文件读取原理??
2) 文件类型和文件权限
文件类型: 普通文件 - 目录文件 d 链接文件 l -- file
find tar which
文件权限: r=4 读 w=2 写 x=1 执行 - 没有权限 0
属主 属组 其他用户
3) 硬链接数
硬链接:
作用概述: 读取文件的多个入口
诞生过程: ln 源文件 链接文件
特点说明:
01. inode号码相同
02. 源文件删除,链接文件依旧有效
03. 目录无法创建硬链接
04. 创建出的新的目录硬链接数默认为2
软链接:
作用概述: 文件数据的快捷方式
诞生过程: ln -s 源文件 链接文件
特点说明:
01. 源文件删除,链接文件失效
02. 普通文件和目录都可以创建软链接
企业面试题: 如何将数据真正的删除?
01. 确保文件的硬链接数为0 i_link
02. 确保文件没有被进程占用 i_count
4) 属组和属主
用户的类型:
超级管理员 root 皇帝
虚拟用户 nobody 傀儡
普通用户 oldboy 平民
5) 文件时间信息
修改时间信息 mtime
访问时间信息 atime
改变时间信息 ctime
find /oldboy -type f -mtime +7 --- 7天以前
find /oldboy -type f -mtime -7 --- 最近7天
find /oldboy -type f -mtime 7 --- 正好前面第7天
date命令如何使用
ntpdate命令进行时间同步
23.系统符号:
1.作用
a 简化操作 .. ~ ; &&
b 进行匹配
2.特殊符号
1) 基础符号系列
美元符号:$
叹号符号: ! 取反
竖线符号: | 管道符号 前一个命令执行结果交给后面命令处理
xargs 命令|xargs 命令
xargs: 将信息进行分组显示
补充: 如何忽略别名功能:
01. 使用命令的绝对路径
02. 在命令执行前加撬棍
03. 在xargs信息后面命令自动忽略别名
查找指定数据信息进行复制 查找出*.txt文件,批量复制到/tmp目录
01. 将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i cp {} /oldgirl
02. 利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "*.txt"|xargs cp -t /oldgirl
查找指定数据信息进行移动 查找出*.txt文件,批量移动到/tmp目录
01. 将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i mv {} /oldgirl
02. 利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "*.txt"|xargs mv -t /oldgirl
井号符号: #
2) 引号符号系列
'' 输出的信息,所见即所得
[root@oldboyedu oldboy]# echo 'oldboy $LANG $oldgirl'
oldboy $LANG $oldgirl
"" 和单引号功能类似 但对特殊信息会做解析
[root@oldboyedu oldboy]# echo "oldboy $LANG $oldgirl"
oldboy en_US.UTF-8 123
``($()) 将引号中的命令先执行,将执行结果交给引号外面的命令进行处理
没有引号 和双引号功能类似 但是可以直接识别通配符信息
3) 重定向符号:
>/1> 标准输出重定向符号
2> 错误输出重定向符号
>>/1> 标准输出追加重定向符号
2>> 错误输出追加重定向符号
如何将正确信息和错误信息都输出到文件中:(日志文件)
[root@oldboyedu oldboy]# cho oldboy >/oldboy/ok.txt 2>/oldboy/error.txt
[root@oldboyedu oldboy]# cat /oldboy/error.txt
-bash: cho: command not found
[root@oldboyedu oldboy]# echo oldboy >/oldboy/ok.txt 2>/oldboy/error.txt
[root@oldboyedu oldboy]# cat /oldboy/ok.txt
oldboy
方法一: 将正确和错误信息同时保留到一个文件
[root@oldboyedu oldboy]# echo oldboy >>/oldboy/info.log 2>>/oldboy/info.log
[root@oldboyedu oldboy]# cho oldboy >>/oldboy/info.log 2>>/oldboy/info.log
[root@oldboyedu oldboy]# cat /oldboy/info.log
oldboy
-bash: cho: command not found
方法二: 将正确和错误信息同时保留到一个文件
[root@oldboyedu oldboy]# echo oldboy &>/oldboy/info.log
[root@oldboyedu oldboy]# cat /oldboy/info.log
oldboy
[root@oldboyedu oldboy]# cho oldboy &>/oldboy/info.log
[root@oldboyedu oldboy]# cat /oldboy/info.log
-bash: cho: command not found
方法三: 将正确和错误信息同时保留到一个文件
[root@oldboyedu oldboy]# echo oldboy >/oldboy/info.log 2>&1
[root@oldboyedu oldboy]# cat /oldboy/info.log
oldboy
[root@oldboyedu oldboy]# cho oldboy >/oldboy/info.log 2>&1
[root@oldboyedu oldboy]# cat /oldboy/info.log
-bash: cho: command not found
< 标准输入重定向符号
tr < xargs <
<< 标准输入追加重定向符号
cat >>/oldboy.txt<<EOF
XXX
XXX
EOF
3.路径信息系列
../ 上一级目录
./ 当前路径
~ 返回到家目录
- 两个目录之间进行快速切换
An argument of - is equivalent to $OLDPWD(环境变量)
补充说明:
[root@oldboyedu tmp]# cd $OLDPWD
[root@oldboyedu oldboy]# cd $OLDPWD
[root@oldboyedu tmp]# cd $OLDPWD
[root@oldboyedu oldboy]# echo $OLDPWD
/tmp
[root@oldboyedu oldboy]# cd /tmp/
[root@oldboyedu tmp]# echo $OLDPWD
/oldboy
4.逻辑符号系列
&& 与逻辑符号 前一个命令执行成功, 再执行后面的命令
|| 或逻辑符号 前一个命令执行失败, 再执行后面的命令
&&符号实践操作:
[root@oldboyedu tmp]# # 需求: 想创建一个/alex目录, 在目录中创建一个oldboy.txt 一条命令搞定
[root@oldboyedu tmp]# mkdi /alex ; touch /alex/oldboy.txt
-bash: mkdi: command not found
touch: cannot touch ‘/alex/oldboy.txt’: No such file or directory
[root@oldboyedu tmp]#
[root@oldboyedu tmp]# mkdi /alex && touch /alex/oldboy.txt
-bash: mkdi: command not found
[root@oldboyedu tmp]# mkdir /alex && touch /alex/oldboy.txt
[root@oldboyedu tmp]# ll /alex/oldboy.txt
-rw-r--r--. 1 root root 0 Oct 10 03:00 /alex/oldboy.txt
[root@oldboyedu tmp]#
||符号实践操作
[root@oldboyedu tmp]# # 需求: /alex/oldboy.txt删除失败了,在/alex/error.txt文件中生成失败信息
[root@oldboyedu tmp]# rmx /alex/oldboy.txt || echo "failed" >>/alex/error.txt
-bash: rmx: command not found
[root@oldboyedu tmp]# cat /alex/error.txt
failed
[root@oldboyedu tmp]# rm /alex/oldboy.txt || echo "failed" >>/alex/error.txt
[root@oldboyedu tmp]# cat /alex/error.txt
failed
5.通配符
利用通配符号匹配文件名称信息
* 模糊匹配所有内容 oldboy old ol o*
find -name "*.txt"
ll /oldboy/*.txt
{} 生成序列信息 (生成一行序列)
生成连续序列
echo {1..10}
echo {01..100}
echo {a..z}
echo {A..Z}
生成不连续序列
echo {1..10..2} 奇数序列
echo {2..10..2} 奇数序列
echo {www,bbs,blog}
生成组合序列
[root@oldboyedu tmp]# echo {A,B}{01,02}
A01 A02 B01 B02
[root@oldboyedu tmp]# echo A{01,02}
A01 A02
[root@oldboyedu tmp]# echo A{,02}
A A02
快速备份文件数据方法
[root@oldboyedu tmp]# # cp /oldboy/oldboy.txt /oldboy/oldboy.txt.bak
[root@oldboyedu tmp]# echo oldboy.txt{,bak}
oldboy.txt oldboy.txtbak
[root@oldboyedu tmp]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[root@oldboyedu tmp]# echo /oldboy/oldboy.txt{,.bak}
/oldboy/oldboy.txt /oldboy/oldboy.txt.bak
[root@oldboyedu tmp]# cp /oldboy/oldboy.txt{,.bak} --最终命令
# 测试题:
01. 在/oldboy目录中创建alex.txt文件,并在/oldboy目录中生成alex.txt.ori备份文件?
mkdir /oldboy
touch alex.txt
cp /oldboy/alex.txt{,.ori}
02. 如何将备份文件快速还原?
rm /oldboy/alex.txt -f
mv /oldboy/alex.txt{.ori,}
快速还原
mv /oldboy/alex.txt.ori /oldboy/alex.txt
回顾:
1) 系统符号:
基础系列: # $ ! |
引号系列: '' "" ``=$() 没引号
定向符号: > >> 2> 2>> < <<
路径符号: . .. ~ -=$OLDPWD
逻辑符号: && || mkdir /oldboy && touch /oldboy/oldboy.txt || echo "目录已经存在,无须创建"
2) 通配符号: 用于匹配文件名称信息
* 模糊匹配信息:
{}生成序列信息: 有序序列 无序序列 组合序列(快速备份和恢复文件)
3) 正则符号
基础正则符号: grep sed awk
^ 以什么开头的信息进行匹配:
[root@oldboyedu ~]# grep "^old" /oldboy/oldboy.txt
oldboy-linux
oldboy-python-linux
oldboy-linux oldboy01
oldboy-python-linux
oldboy-linux
[root@oldboyedu ~]# sed -n '/^old/p' /oldboy/oldboy.txt
oldboy-linux
oldboy-python-linux
oldboy-linux oldboy01
oldboy-python-linux
oldboy-linux
[root@oldboyedu ~]# awk '/^old/' /oldboy/oldboy.txt
oldboy-linux
oldboy-python-linux
oldboy-linux oldboy01
oldboy-python-linux
oldboy-linux
$ 以什么结尾的信息进行匹配
^$取出文件中的空行内容
grep -v "^$" /oldboy/oldboy.txt
24.正则符号:
1.正则符号
1. 利用正则符号匹配文件内容信息
2. 正则符号经常出现在各种开发语言中, python java php
3. 正则符号经常被三剑客命令使用
基础正则符号: basic regular expression BRE
1. 尖角符号:^
以什么开头的信息 ll /oldboy|grep "^d"
2. 美元符号:$
以什么结尾的信息 ll -F /etc/|grep /$
创建测试环境:
cat >>/oldboy/oldboy.txt<<EOF
# oldboyedu-sz-01
oldboy-linux
oldboy-python-linux
# oldboyedu-sh
oldboy-linux
oldboy-python-linux
# oldboyedu-bj
oldboy-linux
java
mysql
go
python
EOF
[root@oldboyedu tmp]# cat /oldboy/oldboy.txt
# oldboyedu-sz-01
oldboy-linux
oldboy-python-linux
# oldboyedu-sh
oldboy-linux
oldboy-python-linux
# oldboyedu-bj
oldboy-linux
java
mysql
go
python
01. 将以oldboy开头的行找出来?
grep "^oldboy" 文件中过滤
grep "^oldboy" 文件中过滤
发屁
cat 文件|grep "^oldboy"
脱裤子 发屁
02. 将以linux结尾的行找出来?
grep "linux$" 文件中过滤
03. 将全部内容显示,但不要显示空行
^oldboy linux$
^$ -- 空行
grep -v "^$" 文件中过滤
3. 尖号美元:^$
空行符号
扩展正则符号: extended regular expression ERE
2.基础正则符号
基础正则符号:
1) 点符号 . ???
匹配任意一个字符,且只有一个字符
命令执行结果:
[root@oldboyedu ~]# grep "." ~/oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
显示匹配过程:
[root@oldboyedu ~]# grep "." ~/oldboy_test.txt -o
I
a
m
o
l
d
2) 星符号 * ???
匹配前一个字符连续出现了0次或者多次
[root@oldboyedu ~]# grep "0*" ~/oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
3) 点和星结合: .* 匹配任意所有信息 .* == *
[root@oldboyedu ~]# grep "^m.*m$" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com
问题: 贪婪匹配问题:
[root@oldboyedu ~]# grep "^m.*o" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
指定具体信息阻止贪婪匹配
[root@oldboyedu ~]# grep "^m.*to" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com
3.转义符号: \
将文件中的以 . 结尾的信息进行过滤??
\作用:
01. 将有特殊意义符号,转义成普通信息进行识别
02. 将没有意义的信息转义为有特殊意义的信息
\n 换行符号
\t 制表符号
换行符号作用:
[root@oldboyedu ~]# echo "oldboy01oldboy02"
oldboy01oldboy02
[root@oldboyedu ~]# echo "oldboy01\noldboy02\noldboy03"
oldboy01\noldboy02\noldboy03
[root@oldboyedu ~]# echo -e "oldboy01\noldboy02\noldboy03"
oldboy01
oldboy02
oldboy03
[root@oldboyedu ~]# echo -e "oldboy01\noldboy02\noldboy03" >oldboy.txt
[root@oldboyedu ~]# cat oldboy.txt
oldboy01
oldboy02
oldboy03
[root@oldboyedu ~]# grep ".$" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
0101010101
11111
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep "\.$" oldboy_test.txt
I teach linux.
my qq num is 49000448.
not 4900000448.
4.括号符号:[ ]
集合:匹配多个字符信息
[root@oldboyedu ~]# grep "oldb[oe]y" oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
问题: 将以I开头和m开头的行都找出来?
[root@oldboyedu ~]# grep "^[Im]" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep "^[a-Z]" /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
5.括号和尖号组合 [^]
排除符号
[root@oldboyedu ~]# grep "[abc]" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep "[^abc]" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
0101010101
11111
my god ,i am not oldbey,but OLDBOY!
25.扩展正则:
6.扩展正则符号
默认 grep sed不能直接识别
grep 提升自己 -- egrep/grep -E
sed 提升自己 -- sed -r
1) +号符号:
匹配前一个字符连续出现了1次或者多次
[root@oldboyedu ~]# grep "0*" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep "0+" oldboy_test.txt
[root@oldboyedu ~]# egrep "0+" oldboy_test.txt # 匹配1次或者多次,0次不匹配
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# egrep "0+" oldboy_test.txt -o
000
00000
张三 110105199004067631
李四 104105199004067631
赵六 oldboy
王五 104105199004067631
找出身份证信息输入错误的内容
[root@oldboyedu ~]# grep [0-9] oldboy_test02.txt
张三 110105199004067631
李四 104105199004067631
王五 104105199004067631
[root@oldboyedu ~]# grep -E "[0-9]+" oldboy_test02.txt
张三 110105199004067631
李四 104105199004067631
王五 104105199004067631
[root@oldboyedu ~]# grep -E "[0-9]+" oldboy_test02.txt -o
110105199004067631
104105199004067631
104105199004067631
[root@oldboyedu ~]# grep -Ev "[0-9]+" oldboy_test02.txt
赵六 oldboy
2) 竖线符号:|
并且符号,用于匹配多个信息
[root@oldboyedu ~]# grep -E "oldboy|oldbey" oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep -E "oldb[oe]y" oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
3) 括号符号: ()
作用:
1. 指定信息进行整体匹配
[root@oldboyedu ~]# grep "oldb[oe]y" oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~]# grep "oldboey" oldboy_test.txt
my god ,i am not oldboey,but OLDBOY!
[root@oldboyedu ~]# grep "oldb(oe)y" oldboy_test.txt
[root@oldboyedu ~]# grep -E "oldb(oe)y" oldboy_test.txt
my god ,i am not oldboey,but OLDBOY!
[root@oldboyedu ~]# grep -E "oldb(o|e)y" oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
2. 进行后项引用前项使用: sed命令替换功能
批量创建用户 oldboy01..oldboy10
[root@oldboyedu ~]# echo oldboy{01..10}
oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10
[root@oldboyedu ~]# echo oldboy{01..10}|xargs
oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10
[root@oldboyedu ~]# echo oldboy{01..3}|xargs -n1
oldboy01
oldboy02
oldboy03
[root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed 's#(.*)#useradd \1#g'
sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS
xargs: echo: terminated by signal 13
[root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
useradd oldboy01
useradd oldboy02
useradd oldboy03
[root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash
useradd: user 'oldboy02' already exists
useradd: user 'oldboy03' already exists
useradd: user 'oldboy04' already exists
企业面试题: 批量创建用户 oldboy01..oldboy10,并给每个用户设置密码信息,默认初始化密码(123456)?
01. 如何创建用户 给用户设置密码
02. 基础命令 echo {}/seq -w 10
03. sed命令替换信息方法
04. 正则符号 .* ()
05. 基础符号 ; |
06. bash内置命令
# 答案:
echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;echo 123456|passwd --stdin \1#g'|bash
seq -w 10 | sed -r "s/(.*)/useradd user\1;echo 123456| passwd --stdin user\1/g"v
将输出的信息
echo 123456 ==> 转换为 <123456>进行显示
[root@oldboyedu ~]# # echo 123456 ==> 转换为 <123456>进行显示
[root@oldboyedu ~]# echo 123456
123456
[root@oldboyedu ~]# echo 123456|sed -r 's#([1-6]+)#\1#g'
123456
[root@oldboyedu ~]# echo 123456|sed -r 's#([1-6]+)#<\1>#g'
<123456>
[root@oldboyedu ~]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>
echo 123456 ==> 转换为 <12><34><56>进行显示
[root@oldboyedu ~]# # echo 123456 ==> 转换为 <12><34><56>进行显示
[root@oldboyedu ~]# echo 123456
123456
[root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\2><\3>#g"
<12><34><56>
[root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><><\3>#g"
<12><><56>
[root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\3><\3>#g"
<12><56><56>
[root@oldboyedu ~]# echo 123456|sed -r "s#(..)(..)(..)#<\1><\2><\3>#g"
<12><34><56>
[root@lala ~/dockerfile/n1]# echo 123456|sed -r 's/(.{2})/<\1>/g'
<12><34><56>
echo 123456 ==> 转换为 <12>34<56>进行显示
[root@lala ~/dockerfile/n1]# echo 123456|sed -r -e 's/(.{2})(.*)(.{2})/<\1>\2<\3>/g'
<12>34<56>
4) 括号符号:{}
可以指定字符连续匹配的次数
第一种情况: x{n,m} 表示前一个字符至少连续出现n次,最多出现m次
[root@oldboyedu ~]# grep -E "0{2,3}" oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# grep "0+" oldboy_test.txt
[root@oldboyedu ~]# grep -E "0+" oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# grep -E "0+" oldboy_test.txt -o
000
00000
[root@oldboyedu ~]# grep -E "0{2,3}" oldboy_test.txt -o
000
000
00
[root@oldboyedu ~]# grep -E "0{2,4}" oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# grep -E "0{2,4}" oldboy_test.txt -o
000
0000
第二种情况: x{n} 表示前一个字符正好连续出现了n次
[root@oldboyedu ~]# grep -E "0{2}" oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# grep -E "0{2}" oldboy_test.txt -o
00
00
00
第三种情况: x{n,} 表示前一个字符至少连续出现n次,最多出现多少次不限
[root@oldboyedu ~]# grep -E "0{2,}" oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~]# grep -E "0{2,}" oldboy_test.txt -o
000
00000
第四种情况: x{,m} 表示前一个字符至少连续出现0次,最多出现m次
[root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
my god ,i am not oldboey,but OLDBOY!
[root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt -o
00
0
00
00
0
5) 问号符号 ?
定义匹配前一个字符出现0或者1次
创建一个测试环境:
cat >>oldboy_test03.txt<<EOF
gd
god
good
goood
gooood
EOF
[root@oldboyedu ~]# grep "o*" oldboy_test03.txt
gd
god
good
goood
gooood
[root@oldboyedu ~]# egrep "o+" oldboy_test03.txt
god
good
goood
gooood
[root@oldboyedu ~]# egrep "o?" oldboy_test03.txt
gd
god
good
goood
gooood
[root@oldboyedu ~]# egrep "o?" oldboy_test03.txt -o
o
o
o
o
o
o
o
o
o
o
[root@oldboyedu ~]# egrep "o+" oldboy_test03.txt -o
o
oo
ooo
oooo
补充: 想让grep sed命令可以直接识别扩展正则
[root@oldboyedu ~]# grep "o\+" oldboy_test03.txt
god
good
goood
gooood
[root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt^C
[root@oldboyedu ~]# echo 123456|sed "s#\(..\)\(..\)\(..\)#<\1><\2><\3>#g"
<12><34><56>
总结:
* 匹配前一个字符出现0次或者多次
+ 匹配前一个字符出现1次或者多次
{} 匹配前一个字符指定出现多少次,至少0次
? 匹配前一个字符出现0次或者1次
作业:利用ip address show eth0只把IP地址信息显示出来?
[root@oldboyedu ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:81:57:66 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::31af:a93d:2d09:e293/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@oldboyedu ~]# ip a s eth0|grep "[0-9].[0-9].[0-9].[0-9]"
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|grep "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
link/ether 00:0c:29:81:57:66 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o
10.0.0.200
10.0.0.255
[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o|head -1
10.0.0.200
[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.)"
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.)" -o
10.
0.
0.
10.
0.
0.
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.){3}[0-9]+" -o
10.0.0.200
10.0.0.255
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o
1500
1000
10.0.0.200
10.0.0.255
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}"
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]#
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o
1500
1000
10.0.0.200
10.0.0.255
[root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o|head -3|tail -1
10.0.0.200
26.三剑客sed:
0.回顾
1) 正则符号
基础正则符号:
^ 以什么开头的信息进行匹配 ^oldboy
$ 以什么结尾的信息进行匹配 oldboy$
^$ 表示匹配空行信息
. 匹配任意一个且只有一个字符 grep "."
* 匹配前一个字符连续出现0次或者多次
.* 匹配所有任意信息 类似于通配符*
\ 将有意义的字符信息,转义成普通字符进行识别
--> 找出文件中以点结尾的信息
将特殊的扩展正则符号,转换成基础正则符号
将没有意义的字符信息转成有意义的字符
\n \r \t
[] 匹配多个字符信息,多个字符匹配时,是或者的关系
[ok] 在文件中找有O的字符信息 找文件中有k的字符信息
PS: 将一个字符串信息,进行拆分成一个一个的字符进行匹配
[^] 对匹配的字符信息进行排除
[^ok] 在文件中找有O的字符信息 找文件中有k的字符信息,进行排除不要显示,显示其他信息
[^o^k]
扩展正则符号:
+ 匹配前一个字符连续出现1次或者多次
| 利用竖线可以匹配多个字符串信息
() 将多个字符信息汇总成整体,进行过滤
进行后项引用前项 (oldboy) \1--sed
{} 指定匹配前一个字符连续出现了多少次
{n,m} 至少连续n次,最多连续m次
{n} 匹配只连续n次的信息
{n,} 至少连续n次,最多不限
{,m} 至少连续0次,最多m次
? 匹配前一个字符连续出现0次或者1次
grep命令识别扩展正则: egrep -E
sed命令识别扩展正则: sed -r
学生问题:
01. 文件中有\撬棍信息,如何进行过滤
[root@oldboyedu ~]# grep '\\' oldboy_test.txt
I \teach \linux.
02. 文件中有$符号, 是识别变量, 还是识别普通符号
[root@oldboyedu ~]# grep '$oldgirl' oldboy_test.txt
$oldgirl
[root@oldboyedu ~]# grep "\$oldgirl" oldboy_test.txt
$oldgirl
1.概述
sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
PS: 全屏编辑工具 vi/vim
应用:主要用于配置文件,以及日志文件的操作
查找流程:会将所有的行都会进行条件判断(所以文件过大操作很慢),同时只要满足就会添加进入模式空间(类似内容),模式空间中的内容都会输出
sed命令作用说明:
1). 擅长对行进行操作处理
2). 擅长将文件的内容信息进行修改调整/删除
编写脚本: 修改文件内容信息时
网络服务中的IP地址进行修改: 50台主机迁移机房--新机房
第一个步骤: vi ifcfg-eth0
第二个步骤: 重启网络服务
第三个步骤: 检查测试
自动修改网卡地址脚本:
第一个步骤: 修改地址
sed -i "s#10.0.0.200#10.0.0.201#g" ifcfg-eth0
第二个步骤: 重启网络服务
systemctl restart network
第三个步骤: 过滤ip a s eth0 网卡地址信息存储到一个文件中 共享存储
具体功能作用:
1) 文件中添加信息的能力 (增) ok
2) 文件中删除信息的能力 (删) ok
3) 文件中修改信息的能力 (改)
4) 文件中查询信息的能力 (查) OK
2. sed命令的语法信息
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
命令 参数 条件+处理= (指令) 处理文件信息
显示出文件中有oldboy行的信息
sed -n '/oldboy/p' oldboy.txt
3. sed命令执行原理
参见原理图
4.sed命令实践操作:
创建测试环境:
cat >person.txt<<EOF
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
01 sed命令查询信息方法
根据文件内容的行号进行查询:
测试1: 显示单行信息
[root@oldboyedu ~]# sed -n '3p' person.txt
103,Alex,COO
测试2: 根据行号信息,输出多行内容(连续)
[root@oldboyedu ~]# sed -n '1,3p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
测试3: 根据行号信息,输出多行内容(不连续)
[root@oldboyedu ~]# sed -n '1p;3p' person.txt
101,oldboy,CEO
103,Alex,COO
根据文件内容的信息进行查询:
测试1: 根据内容信息,输出单行内容
#将有oldboy行的信息找出来
[root@oldboyedu ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
测试2: 根据内容信息,输出多行内容(连续)
#将有oldboy到alex行的信息都输出出来
[root@oldboyedu ~]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
测试3: 根据内容信息,输出多行内容(不连续)
#将有oldboy和alex行的信息都输出出来
[root@oldboyedu ~]# sed -n '/oldboy/p;/Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO
106,oldboy,CIO
02 sed命令添加信息方法
在文件第一行添加信息:
100,oldgirl,UFO
[root@oldboyedu ~]# sed '1i100,oldgirl,UFO' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
在文件最后一行添加信息:
[root@oldboyedu ~]# sed '$a108,oldgirl,UFO' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
108,oldgirl,UFO
测试:
01. 在第三行后面添加oldboy.txt信息
sed '3aoldboy.txt' person.txt
02. 在第二行前面添加oldboy.txt信息
sed '2ioldboy.txt' person.txt
03. 在有oldboy行的前面添加oldgirl 后面添加olddog信息
sed -e '/oldboy/ioldgirl' -e '/oldboy/aolddog' person.txt
[root@oldboyedu ~]# sed -e '/oldboy/ioldgirl' -e '/oldboy/aolddog' person.txt
100,oldgirl,UFO
oldgirl
101,oldboy,CEO
olddog
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
oldgirl
106,oldboy,CIO
olddog
sed '$a100\n101' person.txt 添加多行信息
企业中编写配置文件:
IPaddress=10.10.10.1
mask=255.255.255.0
gateway=10.10.10.254
sed '$aIPaddress=10.10.10.1\nmask=255.255.255.0\ngateway=10.10.10.254' 文件名称
03 sed命令删除信息方法
练习:
01. 删除单行信息
[root@oldboyedu ~]# #删除文件中第三行信息
[root@oldboyedu ~]# sed '3d' person.txt
100,oldgirl,UFO
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
02. 删除多行信息
[root@oldboyedu ~]# #删除文件中第二行到第六行内容
[root@oldboyedu ~]# sed '2,6d' person.txt
100,oldgirl,UFO
106,oldboy,CIO
测试:
01. 删除有oldboy信息的行
sed '/oldboy/d' person.txt
02. 删除第三行和第六行
[root@oldboyedu ~]# #删除文件中第二行到第六行内容
[root@oldboyedu ~]# sed '2,6d' person.txt
100,oldgirl,UFO
106,oldboy,CIO
[root@oldboyedu ~]# sed '3d;6d' person.txt
100,oldgirl,UFO
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
106,oldboy,CIO
问题: 如何利用sed命令取消空行显示?
[root@oldboyedu ~]# sed -n '/./p' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@oldboyedu ~]# sed '/^$/d' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@oldboyedu ~]# sed -n '/^$/!p' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
04 sed命令修改信息方法
sed '22s#原有内容#修改后内容#g' 修改第22行文件信息
sed 's#原有内容#修改后内容#g' 文件信息
[root@oldboyedu ~]# sed 's##oldgirl#old#g' person.txt
sed: -e expression #1, char 12: unknown option to `s'
[root@oldboyedu ~]# sed 's/#oldgirl/old/g' person.txt
100,old,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
sed 's#()#\n#g' 文件信息 后项引用前项进行替换修改
利用sed命令取出IP地址信息:
第一个历程: 取出有IP地址的行
[root@oldboyedu ~]# ip a s eth0|sed -n '3p'
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
第二个历程: 取出IP地址
[root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'
10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
10.0.0.200
sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g' 进行整合
ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'
sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g' 进行整合
sed -n '3 p'
sed -r 's#^.*net (.*)/24.*#\1#g'
sed -rn '3s#^.*net (.*)/24.*#\1#gp'
最终取IP地址方法
[root@oldboyedu ~]# ip a s eth0|sed -rn '3s#^.*net (.*)/24.*#\1#gp'
10.0.0.200
补充01: 修改文件内容直接进行自动备份?
[root@oldboyedu ~]# sed -i.bak 's#oldboy#oldold#g' person.txt
[root@oldboyedu ~]# ll person.txt.bak
-rw-r--r--. 1 root root 104 Oct 10 11:40 person.txt.bak
[root@oldboyedu ~]# cat person.txt.bak
100,#oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
补充02: 在真实替换文件内容时候,一定不能让n和i参数同时出现???
[root@oldboyedu ~]# sed -ni 's#Alex#aaaa#gp' person.txt
103,aaaa,COO
[root@oldboyedu ~]# cat person.txt
103,aaaa,COO
说明: ni和参数同时使用,会将文件内容进行清空
测验替换功能:
创建测试环境:
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy01.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy02.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy03.txt
批量修改文件的扩展名称 将oldboyxx.txt扩展名修改为oldboyxx.jpg
# &将前一个命令过滤的结果放入sed中
[root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'
mv oldboy01.txt oldboy01.jpg
mv oldboy02.txt oldboy02.jpg
mv oldboy03.txt oldboy03.jpg
mv oldboy.txt oldboy.jpg
[root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'|bash
# 批量重命名专业命令: rename?
rename .txt .jpg oldboy*.txt
命令 文件名称需要修改的部分信息 修改成什么信息 将什么样的文件进行修改
[root@oldboyedu ~]# cat person.txt|sed -i 's#COO#CEO#g'
sed: no input files
[root@oldboyedu ~]# sed -i 's#COO#CEO#g' person.txt
# 去掉后缀名
[root@lala ~/dockerfile/n1]# rename '.txt' '' file[0-9].txt
文件中添加内容方法:
01. vim/vi
02. cat >>xxx<EOF .. EOF
03. echo -e "xxx\nxxx"
04. sed 'na/i xxxx\nxxxx\nsxxxx'
总结: sed命令的指令信息
p print 输出信息
i insert 插入信息,在指定信息前面插入新的信息
a append 附加信息,在指定信息后面附加新的信息
d delete 删除指定信息
s substitute 替换信息 s###g(全局替换)
c 替换修改指定的一整行信息
[root@oldboyedu ~]# sed '2coldboyedu-sz-01' person.txt
103,aaaa,CEO
oldboyedu-sz-01 # 将一整行内容完全替换
总结: sed命令的参数信息
-n 取消默认输出
-r 识别扩展正则
-i 真实编辑文件(将内存中的信息覆盖到磁盘中)
-e 识别sed命令多个操作指令
回顾:
01. 课程知识回顾
1) sed流编辑命令
2) 语法结构 sed 参数 [条件-处理方式:指令] 文件信息
3) sed命令实际应用过程
文件中查询信息 参数-n 指令p
文件中增加信息 指令i a
文件中删除信息 参数-i 指令d
文件中替换信息 参数-i.bak 指令 s g c 后项引用前项 &
27.三剑客之awk:
1.awk概念
作用特点:
1. 排除信息
2. 查询信息
3. 统计信息
4. 替换信息
语法格式:
sed [参数] '条件-处理方式' 文件
awk [参数] '模式-动作' 文件
流程:
根据模式进行过滤数据,通过可以进行处理或者输出,没有通过进行下一次循环
2.awk基础语法操作
准备测试环境
[root@oldboyedu ~]# cat awk_test.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
命令查询信息方法:
按照行号查询信息:
awk 'NR=2' awk_test.txt
[root@oldboyedu ~]# awk 'NR=2' awk_test.txt # 显示第二行数据
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboyedu ~]# awk 'NR==2' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu ~]# awk 'NR==2,NR==4' awk_test.txt # 第二到四行
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
[root@oldboyedu ~]# awk 'NR==2;NR==4' awk_test.txt # 第二行和第四行
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
ps: 在linux系统中
oldboy=10 赋值变量信息
oldboy==2 真正oldboy等于数值2
按照字符查询信息:
[root@oldboyedu ~]# awk '/Xiaoyu/' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt # xiaoyu到waiwai
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
[root@oldboyedu ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt # xiaoyu和waiwai
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
测验:
01. 显示xiaoyu的姓氏和ID号码(???)
[root@oldboyedu ~]# awk '/Xiaoyu/{print $1","$3}' awk_test.txt # 用,隔开
Zhang,390320151
[root@oldboyedu ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt # 用空格隔开
Zhang 390320151
02. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字?
[root@oldboyedu ~]# awk '/Zhang/{print $4}' awk_test.txt
:250:100:175
:155:90:201
[root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt # NF表示最后一列,倒数第二列需要用$(NF-1)表示
:250:100:175
:155:90:201
[root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt|awk -F ":" '{print $3}'
100
90
awk '/Zhang/{print $NF}'
awk -F ":" '{print $3}'
[root@oldboyedu ~]# awk -F ":" '/^Zhang/{print $3}' awk_test.txt
100
90
# -F "[ :]+" -F参数指定分隔符,同时支持正则方式匹配 等价于-v FS="[ :]+"
[root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
[root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
03. 显示所有以41开头的ID号码的人的全名和ID号码
[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt # ~代表匹配的意思
Zhang Dandan 41117397
Liu Bingbing 41117483
04. 显示所有ID号码最后一位数字是1或5的人的全名
方法一:
awk '$3~/1$|5$/{print $1,$2}' awk_test.txt
[root@oldboyedu ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt|column -t
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
Lao Nanhai
方法二:
[root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
方法三:
[root@oldboyedu ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
05. 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $NF}' awk_test.txt
:155:90:201
[root@oldboyedu ~]# #gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
$155$90$201
文件中空行进行排除/文件中注释信息进行排除?
grep -Ev "^#|^$" 文件信息
sed -n '/^#|^$/!p' 文件信息
awk '/^#|^$/'
[root@oldboyedu ~]# awk '$0~/^#|^$/' awk_test.txt
#Liu Bingbing 41117483 :250:100:175
[root@oldboyedu ~]# awk '$0!~/^#|^$/' awk_test.txt # $0表示一整行内容
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai 918394135 :250:100:175
总结:awk命令中$符号用法
$1 $2 $3 : 取第几列信息
$NF : 取最后一列
$(NF-n) : 取倒数第几列
$0 : 取一整行的信息
如何利用awk取出IP地址信息:
ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
hostname -i
3. awk高级功能说明
a 对日志信息进行统计(计数)
b 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量
c (数组)进行排序分析
排序
01 192.168.2.1 600 192 深圳 10万
02 192.168.1.10 500 18 上海
03 192.168.3.10 200 20 广州
30 东北 2千
运维总监---运营(推广)总监
d 可以进行脚本编写(循环语句 判断语句) sh awk_nginx.log
awk模式概念说明: 匹配的条件信息
普通的模式:
01. 正则表达式作为模式
awk '/^oldboy/{print xx}'
02. 利用比较匹配信息
NR==2
NR>=2
NR<=2
03. NR==2,NR==10
# 特殊的模式?
awk 'BEGIN{print "性", "名", "qq", "捐款数"}$0!~/^#|^$/{print $0}END{print "结束"}' awk_test.txt |column -t # 去掉空行同时显示表头和结束
BEGIN{} 在awk执行命令前做什么事情:
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' awk_test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai 918394135 :250:100:175
修改内置分隔符变量?
awk -F ":" '{print $2}' awk_test.txt
[root@oldboyedu ~]# awk 'BEGIN{FS=":"}{print $2}' awk_test.txt
END{} 在awk执行命令结束之后做的操作
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai 918394135 :250:100:175
操作结束
统计累加运算测试:?
01. 统计/etc/services文件中空行数量
利用awk公式进行累加运算
[root@oldboyedu ~]# i=0
[root@oldboyedu ~]# echo $((i=i+1))
1
[root@oldboyedu ~]# echo $((i=i+1))
2
[root@oldboyedu ~]# echo $((i=i+1))
3
awk '/^$/' /etc/service
[root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services
空行 i=i+1 0+1 i=1
空行 i=i+1 1+1 i=2
空行 3
空行 4
空行 5
空行 6
空行 7
空行 8
空行 9
空行 10
空行 11
空行 12
空行 13
空行 14
空行 15
空行 16
空行 i=i+1 16+1 i=17
[root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
17
02. 统计/etc/services文件中有井号开头的行
awk '/^#/{i++}END{print i}' /etc/services
03. 统计系统中有多少个虚拟用户 普通用户
第一个历程: 用户信息都保存在什么文件中了
用户信息保存文件: /etc/passwd
第二个历程: 从文件中匹配出虚拟用户 普通用户
匹配普通用户
awk '$NF~/bash/' /etc/passwd
awk '$NF~/\/bin\/bash/' /etc/passwd
第三个历程: 进行统计
普通用户数量
[root@oldboyedu ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
63
虚拟用户数量
[root@oldboyedu ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
22
求和运算:?
sum=sum+$n(需要进行数值求和的列)
[root@oldboyedu ~]# seq 10|awk '{sum=sum+$1;print sum}'
1 sum=sum+$1 0+1 sum=1
2 sum=sum+$1 1+2 sum=3
3 sum=sum+$1 3+3 sum=6
4 6+4 sum=10
5 10+5 sum=15
6 15+6 sum=21
7 28
8 36
9 45
10 45+10 sum=55
作业: 站着听课
01 求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
显示表头
第一总额 第三次总额
xxx xxxx