zoukankan      html  css  js  c++  java
  • Linux基础06 软链接, 硬链接, 查看磁盘状态df, 文件编辑vim(视图模式[批量注释]), 对比文件, 特殊符号, 显示ip地址命令ip, ifconfig, hostname, sed替换命令, awk取列命令

    一.文件的软硬链接
    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
  • 相关阅读:
    继承
    对象和封装
    类的无参、带参方法
    类和对象
    数组
    循环结构
    选择结构
    变量、数据类型和运算符
    快捷键
    MyEclipse与JDK的配置
  • 原文地址:https://www.cnblogs.com/ludingchao/p/15532820.html
Copyright © 2011-2022 走看看