07-三剑客命令及文件属性

 

1、grep:过滤文件内容。【PS:过滤行级别,过滤与关键字相关的行】

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、文件链接

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.1版本代码

      [root@oldboy ~]# mkdir /data/rainbow-v1.1 -p
      [root@oldboy ~]# echo "123" > /data/rainbow-v1.1 /index.html
    2. 创建软链接

      [root@oldboy ~]# ln -s /data/rainbow-v1.1/ /data/rainbow
      [root@oldboy ~]# ll /data/
    3. 检查网站程序

      [root@oldboy ~]# cat /data/rainbow/index.html
      123
    4. 新更新一个网站的程序代码

      [root@oldboy ~]# mkdir /data/rainbow-v1.2
      [root@oldboy ~]# echo "456" > /data/rainbow-v1.2 /index.htmp
    5. 升级

      [root@oldboy ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.2/ /data/rainbow
      [root@oldboy ~]# cat /data/rainbow/index.html
      456
    6. 回退

      [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
  •  
posted @ 2024-03-26 07:21  驼驼2020  阅读(71)  评论(0)    收藏  举报