Linux基础06 软链接, 硬链接, 查看磁盘状态df, 文件编辑vim(视图模式[批量注释],vim故障), 对比文件, 特殊符号, 显示ip地址命令ip, ifconfig, 显示系统信息命令(hostname,whoami,w,uptime,who,uname), sed替换命令, awk取列命令
一.文件的软硬链接
1.软链接
一个快捷方式 可以跨区创建软链接 ln -s 源 目标 企业应用: 版本的升级和回退
一个文件,被分为两个部分:
1)用户数据(真实数据)
2)元数据
元数据:用来描述文件的属性(包括inode)
block:数据块,默认4k(不到4k要占用一个block)
ln -s /root/soft_link /tmp/soft_link (注: 使用相对路径可能会失败, mac本可以软链接到Desktop桌面) 源文件 目标
软链接的应用场景
1)软件升级
2)代码发布
3)不方便移动的目录
4)数据回滚
5)程序读取
2.硬链接
硬链接的作用是允许一个文件拥有多个有效的路径名,
新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,
也就是多个文件名,都是指向同一个inode,这是硬链接的本质。
硬链接特性
#创建硬链接会在对应的目录中增加额外的记录项以引用文件
#对应于同一文件系统上一个物理文件
#每个文件引用相同的inode号
#创建时链接数递增
#删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文
件被删除
#不能跨越驱动器或分区
#不支持对目录创建硬链接
给文件加个入口
不能对目录创建硬链接
ln 源 目标
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次引用 # .. 表示上级目录,上级目录名引用一次,上级目录中的 . 引用一次,子目录中的 .. 引用一次,所是是 3次引用
2)目录不能创建硬链接
软链接
symbolic link,也称为符号链接,类似于windows 中的快捷方式,
软链接是建立一个独立的文件,这个文件的指向的是目标的文件名。
软链接特点 #一个符号链接的内容是它引用文件的名称 #可以对目录创建软链接 #可以跨分区的文件实现 #指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的 引用计数 #软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录 #删除软链接本身,不会删除源目录内容 #删除源目录的文件,不会删除链接文件
#软链接文件的大小,就是执行文件的名称大小(名称占用的字节数)
格式:
ln -s filename linkname
软硬链接 ln -s:做软软链 -f:强制做 -v:反向做链接 &&:衔接多条命令,前面执行成功之后,再执行后面的 ||:衔接多条命令,前面执行不成功,后面也要执行
查看软链接 [root@ubuntu2204 ~]# ll /bin lrwxrwxrwx 1 root root 7 Apr 21 2022 /bin -> usr/bin/
删除软链接
[root@ubuntu2204 0509]# ll total 0 drwxr-xr-x 2 root root 48 Jul 12 15:17 dir1 lrwxrwxrwx 1 root root 5 Jul 12 15:18 dir1.link -> dir1/
#这样是删除链接指向的目录 [root@ubuntu2204 0509]# rm -rf dir1.link/
#这样是删除链接文件 [root@ubuntu2204 0509]# rm -rf dir1.link
软硬链接总结:
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一个意思
:nd // 删除某一行
:n,md // 删除多行,删除n到m行之间所有行
:!command //执行命令
:r!command //读入命令的输出
vim变量 :set nu //显示行号
:set nonu // 取消显示行号
: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 返回 命令模式 (所有选中的行开头都添加了#)
添加
ctrl + v 进入可视块
选中要添加的行(光标移动,选中要改的区域)
shift + i 进行编辑
输入内容
esc退出
删除
ctrl + v 进入可视块
选中要删除的内容
d或x 进行删除
2.可视行模式 命令模式--》shift + v (光标移动,选中要改的区域, 选中按x/d删除)
d 删除
y 复制
p 复制
vim快速进入某一行 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
vim故障
非正常退出,再次进入编辑时,会提示有一个临时文件 vim -r 进入非正常退出之前的状态 都要删除那个临时文件 rm -f .filename.swp
定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存; 写配置文件必须保证能识别,有些短格式在配置文件中无法识 etc/vimrc #全局配置 ~/.vimrc #个人配置
特殊符号和引号相关
特殊符号
> 标准输出重定向 >> 标准输出追加重定向 < 标准输入重定向 {} 生成序列(数字,字母) * 所有
$ 变量 $()
! 取反,非
# 注释
$? 查看上一条命令执行的结果,返回值,0为成功,非0为失败
&& 前面的命令执行成功,才会执行后面的命令
|| 前面的命令执行失败,才会执行后面的命令
& 放入后台
; 多条命令的分隔符
| 把前面的命令的执行结果交给后面的命令
正则 . 任意一个字符 ^ 以什么开头 $ 以什么结尾 | 前面的命令执行结果交给后面的命令 && 前面的命令执行成功,后面的命令才会执行。 || 前面的命令执行失败,后面的命令才会执行。 ! 非 # 注释,注释后面的内容不识别
引号相关
不加引号 所见即所得,会解析变量,支持通配符,如果出现空格,就不会是一个整体
单引号 所见即所得,强引用,会把里面内容看做一个整体
双引号 所见即所得,会解析变量,会把里面内容看做是一个整体
反引号 会先执行反引号里面的命令
显示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
whoami 当前用户 w 显示系统负载,登录的用户 -h 只显示登录的用户信息 uptime 显示系统负载,登录的用户 who 登录的用户信息 uname 显示系统的信息 -a 显示所有信息 -r 显示内核信息 -n 显示主机名 cat /etc/redhat-release 查看系统操作版本信息
sed 替换命令
替换, 取行
选项: -n # 取消默认输出, 和p一起使用,打印第几行(不取消默认输出,打印所有内容) -i # 替换 -i.bak # 先备份(自动加.bak后缀名,可改),再替换(使用小文件) -r # 支持扩展正则使用
= # 显示行号 s # 替换 g # 全局 d # 删除 p # 打印 ! # 取反 a # 追加 i # 插入 $ # 结尾的行
c # 在原位置替换
; # 多条命令的分隔
# 取单行,第一行 [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
# 排除(删除第二行)
sed '2!p' passwd
# 过滤字符串,过滤包含yy的行
sed -n '/yy/p' sed.txt
# 过滤字符串,包含oldboy或yy的行
sed -n '/oldboy/p ; /yy/p' sed.txt
sed -nr '/oldboy|yy/p' sed.txt
# 过滤字符串,从oldboy到yy当中连续所有的行
sed -n '/oldboy/,/yy/p' sed.txt
# 增 i,o
# 在第三行后面追加oldboy
sed '3aoldboy' sed.txt
# 在第四行上方进行插入
sed '4ioldboy' sed.txt
# 加入多行
sed '4ioldboy\noldgirl' sed.txt # \n换行
sed '4ioldboy\toldgirl' sed.txt # \t为8个字符,包含oldboy,后面加2个空格
sed '3aoldboy\noldgirl' sed.txt # 追加
# 在最后一行追加oldboy
sed '$aoldboy' sed.txt
# 将你要替换的内容打印到屏幕上面,确认修改是否正确 [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
# 替换以selinux开头的参数为disabled
sed 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
#c 原位置替换
# //进行匹配查找,查找SELINUXTYPE=开头的, c表示原位替换
sed '/^SELINUXTYPE=/c SELINUXTYPE=enforcing' /etc/sysconfig/selinux
# 替换第一行到第五行
sed '1,5s#root#oldboy#g' passwd
# 替换第一行
sed '1s#root#oldboy#g' passwd
# 替换第一行道最后一行
sed '1,$s#root#oldboy#g' passwd
# 替换$,特殊字符进行转义
sed 's#\$#%#g' sed.txt
# 转义
sed 's/\/sbin\/nologin/oldboy/g' passwd
[root@oldboyedu opt]# grep root passwd [root@oldboyedu opt]# grep admin passwd fbgadmin:x:0:0:admin:/admin:/bin/bash
案例,取ip地址
[root@localhost ~]# ip a s eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:3f:60:b1 brd ff:ff:ff:ff:ff:ff inet 10.0.0.120/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3f:60b1/64 scope link valid_lft forever preferred_lft forever [root@localhost ~]# ip a s eth0|sed -n '3p' inet 10.0.0.120/24 brd 10.0.0.255 scope global eth0 [root@localhost ~]# ip a s eth0|sed -n '3p'|sed -r 's#.*t (.*)/.*#\1#g' # \1取第一个 10.0.0.120 [root@localhost ~]# ip a s eth0|sed -nr '3s#.*t (.*)/.*#\1#gp' # 整合 10.0.0.120
# 取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
# ifconfig eth0 |sed -nr '2s#.*t(.*) n.*#\1#gp' # 取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 擅长取列
取列,计算,统计。数组
选项: -F FS # 输入分隔符,默认是空格 -v # 配合输出分隔符使用 OFS # 输出分隔符 ! # 取反
BEGIN END $n # 某列 NR # 行号 $0 # 完整内容 $NF # 最后一列
NF # 每行的列数 i++ # 计算次数 i=i+$N # 计算和
; # 多条命令的分隔
print # 打印
{} # 整体
注: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 #取大于1,小于等于3的行
awk 'NR>1 && NR<=3' sed.txt
#过滤字符串 //中写要过滤的内容 [root@oldboyedu opt]# awk '/admin/' passwd fbgadmin:x:0:0:admin:/admin:/bin/bash #取反。(过滤出没有该字符的) [root@oldboyedu opt]# awk '!/admin/' passwd
# 过滤多个字符串 |代表或
awk '/jinke|yy/' sed.txt
# 过滤jinke到yy当中连续的行
awk '/jinke/,/yy/' sed.txt
# 过滤,正则
awk '/^r/' passwd
awk '/h$/' 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
# 设置分隔符 -F [root@oldboyedu opt]# awk -F: '{print $7}' passwd # -F:以:分割, 单个分隔符可以直接跟在F后面 [root@oldboyedu opt]# awk -F: 'NR==1{print $7}' passwd # 合并上面命令 /bin/bash
# 设置分隔符 以[]设置,里面可以写多个
awk -F '[,]' '{print $3}' sed.txt
# 取第三列,并且以3开头的行 $n~为固定格式
awk '$3~/^3/' reg.txt
# 取反,第三列,不以3开头的
awk '$3!~/^3/' reg.txt
# 第三列,以1或者5结果
awk '$3~/[15]$/' reg.txt
# 设置分割符为空格和:号,取出开头为Zhang的,第1,2,6列
awk -F '[ :]' '/^Zhang/{print $1,$2,$6}' reg.txt
# 过滤,自定义输出的内容,用$连接(默认输出分隔符以空格分割)
awk -F '[ :]' '/Xiaoyu/{print "$"$5"$"$6"$"$7}' reg.txt
$155$90$201
awk '{print $1","$2}' reg.txt
Zhang,Dandan
# 输出分割符替换成$ -vOFS设定输出分隔符(默认为空格)
awk -F '[ :]' -vOFS='$' '/Xiaoyu/{print $5,$6,$7}' reg.txt
155$90$201
# 去掉空行
awk '!/^$/' file1 # 里面还会存在tab空行
awk '!/^[ \t]*$/' file1 # \t为tab,空行全部去除
awk '!/^\s*$' file1 # \s表示空白字符,去除所有空行
# 计算
# 计算第二列与第一列计算
awk '{print $2/$1}' test.log
awk '{print $2*$1}' test.log
# 不使用文件计算
awk 'BEGIN{print 10-10 }'
# 计算内存可用的百分比
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1985 112 1714 8 158 1715
Swap: 2047 0 2047
[root@localhost ~]# free -m|awk '/^Mem/{print $4/$2*100"%"}'
# Awk 数组
# 统计/etc/services 中空行的数量
[root@localhost ~]# awk '/^$/{i++}END{print i}' /etc/services
# 统计passwd文件中所有shell的数量(最后一列)
awk -F: '{print $NF}' passwd |sort |uniq -c
# 定义一个数组shell,索引值为$7,++为记录次数,END默认输出,打印索引和值
awk -F: '{shell[$7]++}END{for (i in shell)print i,shell[i]}' passwd
# 计算100的和
[root@localhost ~]# seq 100 |awk '{i=i+$1}END{print i}'
5050
案例,取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
ip a s eth0|awk -F '[ /]*' 'NR==3{print $3}'
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