07-三剑客命令及文件属性
grep -i #过滤时不区分大小写 grep -v #排除,即取反,包含关键字的行都不显示(即反向匹配) grep -E #相当于egrep,支持正则表达式,原生grep不支持正则表达式
grep -n #显示行号
grep -c #只输出匹配到的总行数(不是匹配到的次数)
grep "root" /etc/passwd #过滤包含root grep "^root" /etc/passwd #过滤以root开头的行 grep "bash$" /etc/passwd #过滤以bash结尾的行 grep -v "ftp" /etc/passwd #匹配除了包含ftp的内容,其他全部打印 grep -i ”ftp" /etc/passwd #忽略大小写 grep -Ei “sync$|ftp" /etc/passwd #匹配文件中包含syn结尾或ftp字符串 ----------------------------------------------------------------------------------------- grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行 grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行 grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行grep -n "." /etc/passwd #.在grep中表示任意单个字符;
2、sed:替换文件内容。【sed全称是Stream EDitor】
#应用场景:在写脚本时直接通过命令行完成替换修改,无需通过交互式进行编辑后退出的方式修改。
选项:
-i #真实修改文件
-n #表示取消默认的输出(默认会打印原始数据)
sed -i 's#(old)#(new)#g' #s表示开始替换 g(global)表示全局替换。 #默认情况下sed的替换不会修改文件的本身(相当于预览),当加-i时,则真实修改文件。 [root@localhost ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config [root@localhost ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config #把g去掉,则只替换一个 [root@localhost ~]# sed -i '8s#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #8表示仅第8行的进行替换 ------------------------------------------------ 高级用法(取行): -n :取消默认的输出 [root@localhost network-scripts]# ip addr | sed -n '2p' #2指第二行,p指print。-n :表示取消默认的输出,默认会打印原始数据 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 三种方式比较: [root@serverhost ~]# ifconfig virbr0 | sed -n '2p' inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 [root@serverhost ~]# ifconfig virbr0 | awk 'NR==2' inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 [root@serverhost ~]# ifconfig virbr0 | grep "netmask" inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ###注意:sed命令的主体是替换,awk命令的主体是取列,grep命令的主体是过滤。
范例: [root@localhost network-scripts]# ifconfig ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.101 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::1867:6509:1d32:435d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:06:42:28 txqueuelen 1000 (Ethernet) RX packets 22003 bytes 2242446 (2.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 16877 bytes 2593733 (2.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@localhost ~]# ifconfig | sed -n '2p' inet 10.0.0.101 netmask 255.255.255.0 broadcast 10.0.0.255 [root@localhost ~]# ifconfig | sed -n '2p' | sed -r 's#(^.*et)(.*) (net.*$)#\2#g' # -r表示正则表达式 10.0.0.101 # . 表示任意单个字符 # * 表示重复前面字符0次或多次 # 第一个括号前面的所有内容 ^.*et 以任何单个字符开始,重复一次或多次,然后当碰到et后终止匹配 # 第二个括号要匹配需要的内容 .* # 第三个括号匹配到结尾 net.*$
练习题:提取ens32的IP地址,通过如下几种方式来实现: #1.使用grep结合awk实现 [root@localhost ~]# ifconfig ens160| grep 'netmask' | awk '{print $2}' 10.0.0.101 #2.使用grep结合sed实现 [root@serverhost ~]# ifconfig virbr0 | grep "netmask" | sed -r 's#(^.*et)(.*)(net.*$)#\2#g' 10.0.0.101 #3.使用纯awk方法实现(最简单常用的方法) [root@localhost ~]# ifconfig ens160 | awk 'NR==2 {print $2}' 10.0.0.101 #4.使用纯sed方法实现
3、awk:擅长取列。【PS:过滤列级别的,仍然支持取行】
awk -F #指定字段分隔符;默认空格为分隔符
-v #定义变量并将其传递给awk脚本(了解)
-f #指定一个包含awk脚本的文件(了解)
print:打印
NF: 统计总字段数
$: 取值 NR: 当前处理行的行号,如:NR==1 $NF: 最后一列 注意:必须用单引号'' 例如: •{print $1} --->根据分割之后,打印第一列的内容 •{print $NF}:根据分割之后,最后一列
{print $0}:打印整个匹配到的行。{print $1}:打印匹配到的行的第一个字段。{print $2,$3}:打印匹配到的行的第二个和第三个字段。{print NF}:打印匹配到的行的字段数。{sum += $1} END {print sum}:计算匹配到的行的第一个字段的总和,并打印结果。
#举例:将系统的IP地址打印出来,两种方法 #分析: 1.需要拿到IP地址,仅看某一个特定的网卡;ifconfig2.先想办法“过滤”出数据的那一行 3.然后掐头去尾,取中间 [root@localhost ~]#ifconfig ens32 | grep "inet" | awk '{print $2}' [root@localhost ~]#ifconfig ens32 | awk 'NR==2' | awk '{print $2}'
练习题:打印 /etc/passwd中用户名称,以及用户的UID;第一列和第三列,需要以:为分隔符 #分析:1.默认是以空格为分隔符 2.如何自行指定字字段分隔符 -F [root@localhost ~]# awk -F ':' '{print $1,$3}' /etc/passwd #以:为分隔符,并打印文件中的第1列和第3列
#范例1:以空格作为分隔符,提取/etc/passwd这个文件中第一列 [root@localhost ~]# awk '{print $1}' /etc/passwd #范例2:以冒号作为分隔符,然后提取/etc/passwd文件中的第一列 [root@localhost ~]# awk -F ':' '{print $1}' /etc/passwd #范例3:直接提取/etc/passwd文件的第一行 [root@localhost ~]# awk 'NR==1' /etc/passwd #范例4:首先拿到/etc/passwd文件的第一行,然后将第一行的内容以冒号作为分隔符,然后提取第一列 [root@localhost ~]# awk 'NR==1' /etc/passwd | awk -F ':' '{print $1}'
4、文件类型
-
Linux一切皆文件,文件是否需要区分类型
#- 普通文件(音频文件、txt文件、shell脚本文件、mp4)。
#d 目录文件
#s socket,进程间通讯。同一台服务器,两个不同进程,需要相互调用时,可以走socket
#b 块设备,硬盘、U盘
#c 字符设备,键盘、终端都算字符设备
#l 软链接,相当于快捷方式
通过file命令查看
[root@localhost ~]# file test.sh
test.sh: Bourne-Again shell script, UTF-8 Unicode text executable
#注意:实际情况,大家都会遵循一定的规范来进行文件的命令,如果不遵循命名的后缀规范,可以使用file查询文件的类型。比如:视频文件.mp4,脚本文件.sh
5、文件属性
[root@localhost ~]# ls -l
total 20
-rwxrwxr--. 1 root root 2698 Mar 20 11:05 file2
1 2 3 4 5 6 7
第一列:权限
第二列:硬连接数
第三列:文件的属主(拥有人)
第四列:文件的属组(拥有组)
第五列:文件大小
第六列:文件修改时间
第七列:文件名
6.1 文件存储
-
文件有文件名与数据,在Linux上被分为两个部分
-
数据data(block):用来记录文件真实内容
-
元数据metadata(Inode):用来记录文件大小、创建时间、所有者等信息
-
-
真正存储文件时,会将文件名称-->映射对应的Inode值-->保存文件的权限,创建时间,属性等信息-->文件存储的内容在磁盘的哪个block上。
-
权限:读写
-
时间:2020
-
block :block4,block5,block7,block8
-
读取时,文件名称-->Inode编号-->获取block存储的位置-->从磁盘中拿到数据
-
-
Inode:Linux只认识Inode编号,不认识文件名称。(文件名称是inode的一个别名)
-
Block:就是真实存储数据的
-
所以可以解释:为什么cd. 是当前目录,而cd..是上级目录。原因是:
-
.和当前目录的inode是一样的
-
..和上级目录的inode是一样
-
.和..当创建一个文件时,系统默认就有了
-
-
cat oldboy.txt #查看文件内容的过程
![]()
6.2 软链接

-
软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问是源文件本身。
-
源文件本身-->inode-->block
-
软链接-->inode与源文件不一样,但是指向的block是同一个。
-
创建软链接的方式 ln -s +源文件 +链接文件
-
-
软链接的使用场景
-
代码发布时
-
版本升级时
![]()
-
-
软链接实践案例:
-
准备网站1.1版本代码
[root@oldboy ~]# mkdir /data/rainbow-v1.1 -p
[root@oldboy ~]# echo "123" > /data/rainbow-v1.1 /index.html -
创建软链接
[root@oldboy ~]# ln -s /data/rainbow-v1.1/ /data/rainbow
[root@oldboy ~]# ll /data/ -
检查网站程序
[root@oldboy ~]# cat /data/rainbow/index.html
123 -
新更新一个网站的程序代码
[root@oldboy ~]# mkdir /data/rainbow-v1.2
[root@oldboy ~]# echo "456" > /data/rainbow-v1.2 /index.htmp -
升级
[root@oldboy ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.2/ /data/rainbow
[root@oldboy ~]# cat /data/rainbow/index.html
456 -
回退
[root@oldboy ~]# rm- f /data/rainbow && ln -s /data/rainbow-v1.1/ /data/rainbow
[root@oldboy ~]# cat /data/rainbow/index.html
123
-
6.3 硬链接
-
硬链接类似于超市有多个门,无论从哪个门进入,看到的内容都是一样的。回到系统中,我们对硬链接的解释:不同的文件名指向同一个inode,简单的说就是指向同一个真实的数据源。
![]()
-
硬链接与软链接区别
-
ln 命令创建硬链接,ln -s命令创建软链接
-
目录不能创建硬链接,并且硬链接不可以跨分区系统
-
目录软连接特别常用,并且软链接支持跨分区系统
-
硬链接文件与源文件inode相同,软链接文件与源文件inode不同(指向相同的block)。
-
删除软链接文件,对源文件及硬链接无任何影响
-
删除文件的硬链接文件,对源文件及链接文件无任何影响
-
删除链接文件的源文件,对硬链接无影响,但会导致软链接失效
-
删除源文件及其硬链接文件,整个文件会被真正的删除。
-
6.4 磁盘空间不足
-
原因:
- block:比较多大文件,有大量占用磁盘空间的文件导致。(日志、数据)
- inode:用光了,索引节点(存放文件属性信息),一个萝卜一个坑,磁盘空间不足 -
排错:
df -h #查看block,-h == --human-readable人类可读
df -i #查看inode
du -sh #查看目录所占空间
du -sh /
du -sh /etc/ -
解决:
通过删除对应的文件来解决。通过以下方式查看哪些大文件。
[root@oldboyedu ~]# du -sh /*
[root@oldboyedu ~]# du -sh /usr/*
[root@oldboyedu ~]# du -sh /usr/lib/*模拟 block满了
dd if=/dev/zero of=/tmp/big bs=1M count=1000 -



浙公网安备 33010602011771号