一.文件的软硬链接
1.软链接
一个文件,被分为两个部分:
1)用户数据(真实数据)
2)元数据
元数据:用来描述文件的属性(包括inode)
block:数据块,默认4k(不到4k要占用一个block)
ln -s /root/soft_link /tmp/soft_link (注: 使用相对路径可能会失败, mac本可以软链接到Desktop桌面) 源文件 目标
软链接的应用场景
1)软件升级
2)代码发布
3)不方便移动的目录
4)数据回滚
5)程序读取
2.硬链接
1)具有同一个inode号的文件,互为硬链接文件 ls -i 查看文件inode, 系统通过inode号找到文件数据块block, 唯一
[root@localhost ~]# touch hard_link [root@localhost ~]# ln hard_link hard_link1
如图,说明有两个硬链接,inode值相同
需要注意当创建文件夹是,该硬链接数为2。如下图,该文件夹下,有个代表自己的硬链接。
如果在他下面创建个123文件夹。那么在123文件夹下也有个a的硬链接 .. 。所以此时a有3个硬链接
一次类推,如果在123下面再创建一个文件夹。那么a的硬链接还是3。如果在a下面再创建一个文件夹,那么a的硬链接会再加1
2)目录不能创建硬链接
软硬链接 ln -s:做软软链 -f:强制做 -v:反向做链接 &&:衔接多条命令,前面执行成功之后,再执行后面的 ||:衔接多条命令,前面执行不成功,后面也要执行
软硬链接总结:
1)创建命令不同
软链接:ln -s
硬链接:ln
2)目录不能创建硬链接,并且硬链接不可以跨越系统的分区(inode可能冲突),软链接可以
3)硬链接文件与源文件inode相同,软链接文件与源文件inode不同
4)删除软链接文件,对源文件无影响,但是删除软链接源文件对软链接文件有影响
5)删除硬链接文件,对源文件也无影响,并且删除源文件,对硬链接文件也无影响
查看磁盘状态
df
-h 以人类的可读形式显示
-i 显示inode号的数量
[root@oldboyedu opt]# df Filesystem 1K-blocks Used Available Use% Mounted on # 以字节的形式展示 /dev/sda3 50101352 1875312 48226040 4% / devtmpfs 1003144 0 1003144 0% /dev tmpfs 1014044 0 1014044 0% /dev/shm tmpfs 1014044 9808 1004236 1% /run tmpfs 1014044 0 1014044 0% /sys/fs/cgroup /dev/sda1 201380 107052 94328 54% /boot tmpfs 202812 0 202812 0% /run/user/0 [root@oldboyedu opt]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 48G 1.8G 46G 4% / devtmpfs 980M 0 980M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.6M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda1 197M 105M 93M 54% /boot tmpfs 199M 0 199M 0% /run/user/0 [root@oldboyedu opt]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 25062912 60423 25002489 1% / devtmpfs 250786 377 250409 1% /dev tmpfs 253511 1 253510 1% /dev/shm tmpfs 253511 723 252788 1% /run tmpfs 253511 16 253495 1% /sys/fs/cgroup /dev/sda1 102400 326 102074 1% /boot tmpfs 253511 1 253510 1% /run/user/0
企业面试题:
当前磁盘空间还剩余500G,但是就无法往里面写入数据,报错,磁盘空间满了。
查看磁盘容量使用情况df -h
查看inode是否被用完 df -i
查看磁盘信息 df -h:人类可读 -i:查看磁盘inode
然后通过find命令查找文件夹下小文件删除
文件编辑
vi和vim (vim是升级版, 有高亮)
[root@oldboyedu ~]# yum install -y vim
vim 文件 +行数,直接进入编辑某一行内容 [root@oldboyedu ~]# vim /etc/services +100 # 进入第100行
1)三种模式
a.命令模式(普通模式)
[root@oldboyedu ~]# vim /etc/my.cnf G: shift+g ,将光标移动到最后一行 gg/1G: 将光标移动到首行 Ngg/NG:跳转到第N行 dd: 删除(剪切)一行 Ndd/dNd:剪切当前行及向下多少行,包含当前行 D: 将光标之后的内容都删除, 针对当前行的操作 de/dw:删除一组字符串 cw:删除一组字符串,会进入编辑模式 u: 撤销 dG: 删除光标以下的所有内容(包括光标所在行) dgg: 删除光标以上的所有内容(包括光标所在行) $(shift+4): 将光标移动到行尾 ^(shift+6): 将光标移动到行首 ctrl+r: 恢复撤销 x/delete: 删除光标从前往后删除一个字符 X: 删除光标之前的字符 yy: 复制 Nyy,yNy:复制当前行及向下多少行,包含当前行(2yy从光标开始往下复制2行) p(小写): 粘贴(光标所在行的下一行) Np:粘贴多次 P(大写): 粘贴(光标所在行的上一行) NP:粘贴多次 ctrl+f 往下翻页(行比较多) ctrl+b 往上翻页 r: 单个字符替换 R: 多个字符替换(按ESC退出替换,退格键删除替换的恢复原来的) j:向下一个字符 k:向上一个字符 h:向左一个字符
l:向右一个字符
Nj:向下指定N个字符
Nk:向上指定N个字符
Nh:向左指定N个字符
Nl:向右指定N个字符
b.编辑模式
[root@oldboyedu ~]# vim /etc/my.cnf
i:在当前光标所在位置前插入,进入编辑模式
I:将光标跳至行首,并进入编辑模式
A:将光标跳到行末,并进入编辑模式
a:将光标向后移动一个字符,并进入编辑模式
o:将光标调至下一行(新建),并进入编辑模式
O:将光标调至上一行(新建),并进入编辑模式
s:删除光标所在的字符,并在当前位置前进入编辑模式
S:删除光标所在的行,并进入编辑模式
C:删除当前光标所在位置之后的内容(针对当前行), 并进入编辑模式
cw:删除一组字符串,会进入编辑模式
注:当文件编辑时非正常退出,或者编辑的时候,别人也打开改文件,会出现 警告,存在".该文件名.swp"的临时文件(就是正在编辑的内容)
非正常退出的话,可以把该临时文件删除,就能正常打开了。
vim -r:恢复上次异常退出的文件
c.末行模式(底行模式, 底下输入的)
[root@oldboyedu ~]# vim /etc/my.cnf :w //保存当前状态 :w! //强制保存当前状态(例如权限问题, 需要强制保存) :q //退出当前文档(文档必须保存才能退出) :q! //强制退出文档不会修改当前内容 :wq //先保存,在退出 :wq! //强制保存并退出 :x //先保存,再退出 ZZ //保存退出, shfit+zz相当于 :wq 相当于:x :number //跳转至对应的行号,和普通模式Ngg一个意思
vim变量 :set nu //显示行号
:set ic //忽略大小写, 在搜索的时候有用 :set ai //自动缩进 (上一行缩进,下一行自动缩进,写脚本用)
:set list // 给每行的结尾添加一个标识符
:set no[nu|ic|ai|list...] // 取消临时设定的变量
末行模式的报错
E37: No write since last change (add ! to override) # 没保存就退出报错
E45: 'readonly' option is set (add ! to override) # 只读, 比如root用户强制才有用
E212: Unable to open and write files
末行模式(查找和替换)
查找 /string 需要搜索的内容(查找) n 按搜索到的内容依次往下进行查找 N 按搜索到的内容依次往上进行查找 替换 :s###g (/,#或@分割都行, /碰到路径需要转义\/) :1,5s#sbin#test#g 替换1-5行中包含sbin的内容为test :%s#sbin#test#g 替换整个文本文件中包含sbin的替换为test :%s#sbin#test#gc 替换内容时时提示是否需要替换 %表示所有行 s表示替换 g表示所有匹配到的内容 c表示提示
替换为 w (y/n/a/q/l/^E/^Y)?
y:替换一次
n:选中下一个
a:全部替换
q:退出
l:替换一次并退出询问
另存
:w /root/test 将文件所有内容另存为/root/test
读入
:r /etc/hosts 读入/etc/hosts文件至当前光标下面
:5r /etc/hosts 指定/etc/hosts文件当前文件的哪行下面
d.视图模式
1.可视块模式 命令模式--》ctrl + v (选中,按r输入全部替换, 按x/d删除) 如何批量注释文本? 1)进入可视块模式 ctrl + v 2)进入编辑模式,进入行首 shift + i (I) 3)添加注释 shift + 3 (#) 4)ESC 返回 命令模式 2.可视行模式 命令模式--》shift + v (相当于多选行, 选中按x/d删除) vim 文件 +行数,直接进入编辑某一行内容 [root@oldboyedu ~]# vim /etc/services +100 # 进入第100行
同时编辑多个文件
vim -o a.sh zls.txt (水平分割)# ctrl +w + w进行切换 vim -O a.sh zls.txt (垂直分割)# ctrl +w + w进行切换
对比文件
1.vimdiff vimdiff file1 file2 优点:直观,高亮显示出不同的地方 2.diff diff file1 file2 缺点:不直观
替换 tr
特殊符号
> 标准输出重定向 >> 标准输出追加重定向 < 标准输入重定向 {} 生成序列(数字,字母) * 所有 正则 . 任意一个字符 ^ 以什么开头 $ 以什么结尾 | 前面的命令执行结果交给后面的命令 && 前面的命令执行成功,后面的命令才会执行。 || 前面的命令执行失败,后面的命令才会执行。 ! 非 # 注释,注释后面的内容不识别
显示ip地址命令
ip 显示ip地址
ip a 和ip address相同,显示ip地址
ip a/address
[root@oldboyedu opt]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:71:30:98 brd ff:ff:ff:ff:ff:ff inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::80b2:dc89:7adf:c7b1/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:71:30:a2 brd ff:ff:ff:ff:ff:ff inet 172.16.1.100/24 brd 172.16.1.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever inet6 fe80::8a2a:8884:9bb5:fd5f/64 scope link noprefixroute valid_lft forever preferred_lft forever
指定显示的网卡
ip address show/s eth0
[root@oldboyedu opt]# 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:71:30:98 brd ff:ff:ff:ff:ff:ff inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::80b2:dc89:7adf:c7b1/64 scope link noprefixroute valid_lft forever preferred_lft forever
ifconfig 显示ip地址命令,centos-7默认没有安装此命令。需下载
yum install -y net-tools
ifconfig 查看ip地址信息,掩码
ifconfig 网卡名 显示指定网卡信息
[root@oldboyedu opt]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::80b2:dc89:7adf:c7b1 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:71:30:98 txqueuelen 1000 (Ethernet) RX packets 7445 bytes 686696 (670.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4771 bytes 774255 (756.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
hostname 显示主机名
-I 显示所有的IP地址
-i 显示所有的IP地址,还会显示物理Mac地址
[root@oldboyedu opt]# hostname -I 10.0.0.100 172.16.1.100
sed 替换命令
# 取单行,第一行 [root@oldboyedu opt]# sed -n '1p' passwd # -n取消默认输出,有n就有p进行显示,显示行号 # 取多行,不连续的多行,1和4行 [root@oldboyedu opt]# sed -n '1p;4p' passwd # 取连续的多行,1到4行 [root@oldboyedu opt]# sed -n '1,4p' passwd # 过滤字符串 [root@oldboyedu opt]# sed -n '/root/p' passwd #-n取消默认输出,有n就有p进行显示 # 排除字符串 [root@oldboyedu opt]# sed '/root/d' passwd # 删除当行,删除第一行 [root@oldboyedu opt]# sed '1d' passwd # 删除不连续的多行,删除第一行和第四行 [root@oldboyedu opt]# sed '1d;4d' passwd # 删除连续的多行,删除第一行到第15行 [root@oldboyedu opt]# sed '1,15d' passwd # 将你要替换的内容打印到屏幕上面,确认修改是否正确 [root@oldboyedu opt]# sed 's#root#admin#g' passwd # 真正替换,会修改文件的内容(危险) [root@oldboyedu opt]# sed -i 's#root#admin#g' passwd
# 先创建并备份到passwd.bak中,然后替换文件中字符保存
[root@oldboyedu opt]# sed -i.bak 's#root#admin#g' passwd [root@oldboyedu opt]# grep root passwd [root@oldboyedu opt]# grep admin passwd fbgadmin:x:0:0:admin:/admin:/bin/bash
案例,取ip地址
# 取ifconfig命令中的 [root@oldboyedu opt]# ifconfig eth0 | sed -n '2p' inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 [root@oldboyedu opt]# ifconfig eth0 | sed -n '2p' |cut -d ' ' -f 10 10.0.0.100 # 取ip命令中的 [root@oldboyedu opt]# ip a s eth0 |sed -n '3p' inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 [root@oldboyedu opt]# ip a s eth0 |sed -n '3p' |sed 's#/# #g' |cut -d ' ' -f 6 10.0.0.100 [root@oldboyedu opt]# ip a s eth0 |sed -n '3s#/# #gp' # 优化, 取3行和过滤命令合并 inet 10.0.0.100 24 brd 10.0.0.255 scope global noprefixroute eth0 [root@oldboyedu opt]# ip a s eth0 |sed -n '3s#/# #gp' |cut -d ' ' -f6 10.0.0.100
[root@oldboyedu opt]# ifconfig eno16777736|sed -rn '2s#^.*t (.*) n(.*)#\1#gp'# -r使用正则表达式,\1使用第一个选择参数
10.0.0.100
awk 擅长取列
注:awk中单引号中内容可转义。bash中双引号或没有引号可转义。是相反的
#取单行,取出第一行 [root@oldboyedu opt]# awk 'NR==1' passwd # 行号用NR来表示 #取不连续的多行,第一行和第三行 [root@oldboyedu opt]# awk 'NR==1;NR==3' passwd #取连续的多行,第一行到第三行 [root@oldboyedu opt]# awk 'NR==1,NR==3' passwd #过滤字符串 [root@oldboyedu opt]# awk '/admin/' passwd fbgadmin:x:0:0:admin:/admin:/bin/bash #取反。(过滤出没有该字符的) [root@oldboyedu opt]# awk '!/admin/' passwd #取列 NF表示最后一列 [root@oldboyedu opt]# awk 'NR==1' passwd # NR表示取行 fbgadmin:x:0:0:admin:/admin:/bin/bash [root@oldboyedu opt]# awk 'NR==1' passwd | awk -F '[:]' '{print $7}' # 以: 为分隔符(可写多个, 默认以无限多空格为分隔符), 打印第7列 /bin/bash [root@oldboyedu opt]# awk 'NR==1' passwd | awk -F '[:]' '{print $NF}' # NF表示取最后一列 /bin/bash [root@oldboyedu opt]# awk -F: '{print $7}' passwd # -F:以:分割, 单个分隔符可以直接跟在F后面 [root@oldboyedu opt]# awk -F: 'NR==1{print $7}' passwd # 合并上面命令 /bin/bash
案例,取ip地址,创建用户
# 取ip地址 [root@oldboyedu opt]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 ... [root@oldboyedu opt]# ifconfig eth0 | awk 'NR==2' inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 [root@oldboyedu opt]# ifconfig eth0 | awk 'NR==2' |awk '{print $2}' 10.0.0.100 [root@oldboyedu opt]# ifconfig eth0| awk '{print $2}' [root@oldboyedu opt]# ifconfig eth0| awk 'NR==2{print $2}' # 优化命令 10.0.0.100 # 取IP地址 [root@oldboyedu opt]# 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:71:30:98 brd ff:ff:ff:ff:ff:ff inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 ... [root@oldboyedu opt]# ip a s eth0 | awk 'NR==3' inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 [root@oldboyedu opt]# ip a s eth0 | awk 'NR==3' |awk -F '[ /]' '{print $6}' # 以空格和/为分隔符(此处不是默认无限多空格需要一个个数) 10.0.0.100 [root@oldboyedu opt]# ip a s eth0 |awk -F '[ /]' 'NR==3{print $6}' 10.0.0.100
# 创建用户
[root@oldboyedu ~]# seq '10'|awk '{print "useradd oldboy"$1}' # seq创建列表
useradd oldboy1
useradd oldboy2
...
[root@oldboyedu ~]# seq '10'|awk '{print "useradd oldboy"$1}'|bash # 创建oldboy1-10账户
# 获取用户信息
[root@oldboyedu ~]# echo 'I am zls, QQ:1333344556, age 18.' > zls.txt
[root@localhost ~]# awk -F '[.,: ]' '{print $3,$6,$9}' zls.txt
zls 1333344556 18
[root@localhost ~]# awk -F '[.,: ]+' '{print $3,$5,$7}' zls.txt # 分隔符后面+贪婪匹配,一起的分隔符算一个
zls 1333344556 18