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

 

posted @ 2021-11-18 16:14  战斗小人  阅读(326)  评论(0编辑  收藏  举报