• 程序员应该掌握的一些 Linux 命令


    文章配图

    程序员应该掌握的一些 Linux 命令

    作为一名后端开发,跟服务器的交流必不可少,刚好最近跟服务器打交道比较多,所以就汇总整理一下 Linux 下那些程序员经常需要使用的命令,掌握这些命令基本上可以在 Linux 系统里面横着走了(我明天在说大话了)

    命令格式和帮助信息

    常见的 Linux 命令格式是:命令名称,命令参数,命令对象,它们之间使用空格键隔开,大致如下:

    命令名称 [命令参数] [命令对象]
    

    一条完整的命令参数比较长,很容易劝退新手,所以很多时候我推荐短命令格式,更好记,他们区别如下:

    # 长格式:
    man --help
    
    # 短格式
    man -h
    

    当你不可能记住 Linux 所有的命令,当你遇到不熟悉的命令,可以 man 来查看帮助信息(如上),通常 man 帮助文档都很长,你可能需要知道一些关于文档的翻页、搜索、定位操作:

    按键 用途
    Page down 下一页
    Page up 上一页
    home 首页
    end 页尾
    / 从上往下搜索关键字
    ? 从下往上搜索关键字
    n 定位到下一个关键字
    N 定位到上一个关键字
    q 退出帮助文档

    知道了文档操作方式,那么可以了解一下 man 帮助文档的结构,因为大多数文档很长,如果不了解结构,读起来可能会比较困惑,我们找一个比较简单的 pwd 命令看看:

    man pwd     # 查看 man 帮助文档
    
    NAME        # 命令的名称
           pwd - print name of current/working directory
    SYNOPSIS    # 参数的大致使用方法
           pwd [OPTION]...
    DESCRIPTION # 介绍说明
           Print the full filename of the current working directory.
    AUTHOR      # 作者
           Written by Jim Meyering.
    REPORTING BUGS   # Bug 反馈
           ....
    COPYRIGHT       # 版权信息
           ....
    SEE ALSO        # 相关资料
           ...
    

    常用的系统命令

    这里简单说介绍说明一下日常的命令和使用方法,更加详细的可以参考 man 命令:

    echo 命令

    主要用于输出文本和变量
    输出一行本文示例如下:

    echo "hello world"
    hello world
    

    输出一行变量(局部变量、环境变量、shell 变量)示例如下:

    echo $SHELL
    /bin/bash
    

    data 命令

    date 命令主要用于查看、修改系统时间,示例:

    data
    Sun Jun 13 09:19:33 CST 2021
    

    按照指定格式查看系统时间:

    date "+%Y-%m-%d %H:%M:%S"
    2021-06-13 09:23:12
    

    将当前系统时间设置为指定时间:

    date -s "20210613 9:27:00"
    Sun Jun 13 09:27:00 CST 2021
    

    wget 命令

    通常我们在服务器搭建生产环境就会经常用到 wget 从网上下载程序包,如果不加任何参数,它就会将链接资源下载到当前目录,例如我从网上下载一份 PDF 文件,效果如下:

    wget http://www.linuxprobe.com/docs/LinuxProbe.pdf    # 下载
    
    --2021-06-13 10:12:14--  http://www.linuxprobe.com/docs/LinuxProbe.pdf
    Resolving www.linuxprobe.com (www.linuxprobe.com)... 59.37.142.226
    Connecting to www.linuxprobe.com (www.linuxprobe.com)|59.37.142.226|:80... connected.
    HTTP request sent, awaiting response... 301 Moved Permanently
    Location: https://www.linuxprobe.com/docs/LinuxProbe.pdf [following]
    --2021-06-13 10:12:14--  https://www.linuxprobe.com/docs/LinuxProbe.pdf
    Connecting to www.linuxprobe.com (www.linuxprobe.com)|59.37.142.226|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 17676281 (17M) [application/pdf]
    Saving to: 'LinuxProbe.pdf'
    
    LinuxProbe.pdf                                             100%[=====================================================================================================================================>]  16.86M  29.2MB/s    in 0.6s
    
    2021-06-13 10:12:15 (29.2 MB/s) - 'LinuxProbe.pdf' saved [17676281/17676281]
    

    然后我们查看目录

    ls
    LinuxProbe.pdf
    

    另外 wget 还有一些命令参数,大概了解就好:

    参数 作用
    -b 后台下载
    -P 指定目录
    -t 尝试次数
    -r 递归下载
    |-p 下载所有资源

    ps 命令

    查看系统进程状态,通常会和 | grep 管道符号一起使用,我们通常执行 ps aux 可以看到以下输出:

    ps aux
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root           1  0.0  0.5 177084 10100 ?        Ss   Mar02   1:24 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
    root           2  0.0  0.0      0     0 ?        S    Mar02   0:02 [kthreadd]
    root           3  0.0  0.0      0     0 ?        I<   Mar02   0:00 [rcu_gp]
    root           4  0.0  0.0      0     0 ?        I<   Mar02   0:00 [rcu_par_gp]
    

    简单说一下每列所代表的含义:

    • USER 进程的所有者
    • PID 进程 ID ( kill 命令指定的就是这里的 ID)
    • %CPU CPU 占用率
    • %MEM 内存占用率
    • VSZ 虚拟内存使用量,单位是 KB
    • RSS 固定的内存占用量,单位是 KB
    • TTY 所在终端
    • STAT 进程状态(重点!,下面会详细说一下)
    • START 启动时间
    • TIME 使用 CPU 的时间
    • COMMAND 进程相关的参数和命令

    在 Linux 系统中,有 5 种常见的进程状态(上面的 STAT 标题)

    • R 运行或等待运行
    • S 中断或处于休眠中
    • D 不可中断,即使 kill 命令也不能将其终端
    • Z 进程已中止,但是进程描述符依然存在
    • T 进程已停止

    top 命令

    可以实时监控进程活动和系统负载等信息,Windows | Mac OS X 里面的活动监视器,字段详情如下:

    # top 系统时间,up 运行时间,users 登陆终端数,load average 系统平均负载
    top - 15:55:42 up 102 days, 17:15,  2 users,  load average: 0.00, 0.00, 0.00
    # Tasks 进程总数,running 运行中的进程数,sleeping 睡眠进程数,stopped 停止的进程数,zombie 僵死的进程数
    Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
    # 用户资源百分比,系统内核占用资源百分比,……空闲资源百分比
    %Cpu(s):  0.5 us,  0.3 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.2 hi,  0.2 si,  0.0 st
    # 物理内存,内存使用量,内存空闲量,内核缓存的内存量
    MiB Mem :   1723.2 total,    133.9 free,    732.1 used,    857.2 buff/cache
    # 虚拟内存总量,虚拟内存使用量,虚拟内存空闲量,……
    MiB Swap:      0.0 total,      0.0 free,      0.0 used.    832.9 avail Mem
    # 进程运行列表
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     228727 root      10 -10  172776  23340  10092 S   1.3   1.3 228:14.78 AliYunD+
     228682 root      10 -10   43328   5424   3792 S   0.3   0.3  13:08.95 AliYunD+
          1 root      20   0  177084  10100   7208 S   0.0   0.6   1:24.99 systemd
          2 root      20   0       0      0      0 S   0.0   0.0   0:02.27 kthreadd
    

    pidof 命令

    可以通过服务名称查询进程的 PID,如下:

    pidof mongod
    226807
    

    kill 命令

    如果要终止指定的服务进程,通常会使用 pidof 查询的的 PID,然后使用 kill 干掉它

    kill 226807
    

    killall 命令

    通常很多复杂软件不止一个进程,使用 kill 会比较麻烦,使用 killall [参数][服务名称] 则会方便很多,驶入

    pidof httpd
    13581 13580 13578 13577
    killall httpd
    

    状态检测命令

    以下命令都超级实用,掌握了之后,对于线上问题排查会很大的帮助作用

    ifconfig 命令

    服务器网络应该是程序员检查最多的状态,很多时候服务器无法访问,程序员第一时间检查网络是否正常,Linux 中使用 ifconfig 用于获取网卡配置与网络状态。我们主要关注以下几个指标即可:

    • 网卡名称,inet 参数后面的 IP 地址
    • ether 参数后面的网卡物理地址,也是 MAC 地址
    • RX,TX 接收数据包与发送数据包的个数累积流量

    我们看一个示例:

    ifconfig
    # 网卡名称
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            # IP 地址
            inet 172.19.119.156  netmask 255.255.240.0  broadcast 172.19.127.255
            inet6 fe80::216:3eff:fe14:3ae3  prefixlen 64  scopeid 0x20<link>
            # MAC 地址
            ether 00:16:3e:14:3a:e3  txqueuelen 1000  (Ethernet)
            # 接收的数据包
            RX packets 5544498  bytes 3279315266 (3.0 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            # 发送的数据包
            TX packets 4845972  bytes 984357847 (938.7 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    uname 命令

    查看系统版本信息时,就需要用上该命令,通常会加上选项参数 -a 使用,不然只输出 Linux 似乎没有任何意义,如下:

    uname -a
    Linux iZwz9bvey7lnzwc5wzksanZ 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
    

    以上信息解析如下:

    • 内核名称:Linux
    • 主机名:iZwz9bvey7lnzwc5wzksanZ
    • 内核发行版:4.18.0-193.28.1.el8_2.x86_64
    • 节点名称:#1
    • 系统时间:SMP Thu Oct 22 00:20:22 UTC
    • 硬件信息以及操作系统等:x86_64 x86_64 x86_64 GNU/Linux

    当然如果你需要查看当前发行版的信息,需要查看 redhat-release 文件,命令如下:

    cat /etc/redhat-release
    CentOS Linux release 8.2.2004 (Core)
    

    uptime 命令

    一个简洁的查看系统负载信息的命令,使用如下:

    uptime
    16:47:02 up 102 days, 18:06,  5 users,  load average: 0.00, 0.00, 0.00
    

    可以很方便的查看系统运行时间,连接终端数量,平均负载信息等。顺带一提,关于平均负载的几个注意事项:

    • 平均负载是指系统最近 1 分钟、5 分钟、15 分钟内的压力情况
    • 负载值通常来说是越低越好,尽量不要长期超过 1,生产环境不要超过 5

    free 命令

    显示当前系统的内存情况,直接输出是字节数,加上 free -h 更符合人类的阅读习惯,如下:

                  total        used        free      shared  buff/cache   available
    Mem:          1.7Gi       751Mi       113Mi       2.0Mi       858Mi       813Mi
    Swap:            0B          0B          0B
    

    总内存书,已使用,未使用这里很清晰就不多讲了。

    who 命令

    查看登陆主机的用户终端信息,有时候用来排查谁修改配置,黑客攻击等情况:

    who
    root     pts/0        Jun 13 15:44 (120.85.126.66)
    root     pts/1        Jun 13 15:55 (120.85.126.66)
    root     pts/2        Jun 13 16:23 (120.85.126.66)
    

    last 命令

    用于查看所有系统的登陆记录,这些信息都是以日志文件保存,很容易被篡改

    last
    root     pts/5        120.85.126.66    Sun Jun 13 16:57   still logged in
    root     pts/4        120.85.126.66    Sun Jun 13 16:46   still logged in
    root     pts/3        120.85.126.66    Sun Jun 13 16:35   still logged in
    ..... 这里省略一万条登陆信息 .....
    

    history 命令

    这应该是我最常用的命令,可以查看当前用户最近执行过的 1000 条命令,如果觉得不够的话可以修改 /etc/profile 文件中的 HISTSIZE 变量(其实大多数场景下够用了),甚至大多数场景都是比较多的,我通常还会在后面增加数组选项来限制它的输出,如下:

    history 5
    325  history 15
    326  clear
    327  man history
    328  history
    329  history 5
    

    可以看到我最近输入了 300 多条命令,因为有参数的限制,所以它只输出了最后 5 条,历史命令都被保存在用户目录的 .bash_history 文件中(Linux 使用 . 开头的均代表隐藏文件),可以使用 cat 查看文档内容:

    cat ~/.bash_history
    

    如果要清空历史命令,可以使用 -c 选项,如下:

    history -c
    

    sosreport 命令

    这个应该很少用,就是用于生成系统的诊断文档,提供给技术支持人员查看的,因为很少用就不详细概述了


    工作目录命令

    不同于图形化操作系统,想要 Linux 系统来回穿梭,不得不掌握这些命令

    pwd 命令

    显示当前所在的目录,普通用户登陆进入默认在 /home/当前用户 的目录下,如果是 root 用户则在根目录的 /root 目录下:

    pwd
    /root
    

    cd 命令

    切换目录的命令,常见的用法是 cd [目录名称],当然还有一些其他的用法,查看示例:

    cd /etc   # 进入 /etc 目录
    cd /bin   # 进入 /bin 目录
    cd ..     # 切换到当前目录的上一级
    cd ~      # 切换到当前用户目录的根目录
    

    ls 命令

    显示目录的文件列表,常用的选项参数有:

    • -a 查看全部文件,包括隐藏文件
    • -l 查看文件的属性

    示例:

    ls -al
    
    dr-xr-xr-x.  17 root root  244 Mar  2 22:37 .
    dr-xr-xr-x.  17 root root  244 Mar  2 22:37 ..
    -rw-r--r--    1 root root    0 Nov 20  2020 .autorelabel
    lrwxrwxrwx.   1 root root    7 May 11  2019 bin -> usr/bin
    dr-xr-xr-x.   5 root root 4096 Nov 20  2020 boot
    drwxr-xr-x   19 root root 2960 Jun 12 11:32 dev
    drwxr-xr-x.  96 root root 8192 Mar  2 22:42 etc
    drwxr-xr-x.   2 root root    6 Jun 11 16:05 home
    ........ 这里省略很多目录 ........
    

    文本编辑命令

    前面讲的都是系统信息查询,切换,那么找到文件,编辑命令自然是要派上用场的,Linux 下常用的编辑命令有:

    cat 命令

    主要用于查看 内容较少的文本,如果加上 -n 选项参数还能看到行号,如下:

    cat -n ecs_network_optimization.log
    
         1	running /sbin/ecs_mq_rps_rfs
         2	========  ECS network setting starts 2021-03-02 22:37:28 ========
         3	optimize network performance: current device eth0
         4	set and check multiqueue on eth0
         5	only support 1 queue; no need to enable multiqueue on eth0
         6	OK. irqbalance stoped.
         7	max node :0
         8	mask:1, irq:29
         9	mask:2, irq:30
        10	========  ECS network setting END 2021-03-02 22:37:28  ========
    

    more 命令

    主要用于查看 内容较多的文本more 面对大量文本相比 cat 有如下优势:

    • 不会快速翻滚,文本底部会有百分比来提示已阅读多少内容
    • 使用快捷键可以进行翻页

    大概是这样

    more dnf.log
    2021-05-26T12:10:13Z DDEBUG Command: dnf makecache --timer
    2021-05-26T12:10:13Z DDEBUG Installroot: /
    2021-05-26T12:10:13Z DDEBUG Releasever: 8
    2021-05-26T12:10:13Z DEBUG cachedir: /var/cache/dnf
    2021-05-26T12:10:13Z DDEBUG Base command: makecache
    2021-05-26T12:10:13Z DDEBUG Extra commands: ['makecache', '--timer']
    2021-05-26T12:10:13Z DEBUG Unknown configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
    2021-05-26T12:10:13Z DEBUG Making cache files for all metadata files.
    2021-05-26T12:10:13Z DEBUG AppStream: has expired and will be refreshed.
    2021-05-26T12:10:13Z DEBUG BaseOS: has expired and will be refreshed.
    --More--(0%)    # 显示阅读进度
    

    head 命令

    如果不需要完整阅读文档,只查看前 N 行就可以使用 head 命令,不加参数默认是前 10 行,可以使用 -n 参数指定输出的行数,效果如下:

    head  dnf.log
    2021-05-26T09:08:04Z INFO Metadata cache created.
    2021-05-26T09:08:04Z DDEBUG Cleaning up.
    2021-05-26T10:08:13Z INFO --- logging initialized ---
    2021-05-26T10:08:13Z DDEBUG timer: config: 2 ms
    2021-05-26T10:08:13Z DEBUG Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, needs-restarting, playground, repoclosure, repodiff, repograph, repomanage, reposync
    2021-05-26T10:08:13Z DEBUG DNF version: 4.2.23
    2021-05-26T10:08:13Z DDEBUG Command: dnf makecache --timer
    2021-05-26T10:08:13Z DDEBUG Installroot: /
    2021-05-26T10:08:13Z DDEBUG Releasever: 8
    2021-05-26T10:08:13Z DEBUG cachedir: /var/cache/dnf
    

    tail 命令

    跟 head 相反,这里输出日志的最后 N 行,但是 tail 更常用,得益于 -f 参数可以实时监控输出,所以用于查报错日志,监控日志输出的时候特别有用,也是平时在服务器上很常用的一个命令

    tail -f dnf.log
    2021-06-13T10:24:02Z DDEBUG Command: dnf makecache --timer
    2021-06-13T10:24:02Z DDEBUG Installroot: /
    2021-06-13T10:24:02Z DDEBUG Releasever: 8
    2021-06-13T10:24:02Z DEBUG cachedir: /var/cache/dnf
    2021-06-13T10:24:02Z DDEBUG Base command: makecache
    2021-06-13T10:24:02Z DDEBUG Extra commands: ['makecache', '--timer']
    2021-06-13T10:24:02Z DEBUG Unknown configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
    2021-06-13T10:24:02Z DEBUG Making cache files for all metadata files.
    2021-06-13T10:24:02Z INFO Metadata cache refreshed recently.
    2021-06-13T10:24:02Z DDEBUG Cleaning up.
    > # 这里不会终止,一直监控日志的输出
    

    tr 命令

    用于大批量替换文本,通常结合管道符号使用,这里就不详细描述了(其实我更喜欢通过 VIM 来替换文本)

    wc 命令

    统计文本的行数、字数、字节数,比较常用的参数有:

    • -l 只现实行数
    • -w 只显示单词数
    • -c 只显示字节数

    我们可以找一个日志文件看看:

    wc dnf.log
    8863  71220 682533 dnf.log
    

    还有一个有趣的玩法是用来统计 /etc/passwd 文件的行数可以统计当前系统有多少用户(/etc/passwd 保存系统的用户信息):

    wc -l /etc/passwd
    29 /etc/passwd
    

    stat 命令

    相当于 Windows 查看文件属性,可以看到文件具体的存储信息和时间

    stat ip_address
      File: ip_address
      Size: 12        	Blocks: 8          IO Block: 4096   regular file
    Device: fd01h/64769d	Inode: 100709276   Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2021-06-13 18:33:47.951395782 +0800
    Modify: 2021-06-13 18:33:47.951395782 +0800
    Change: 2021-06-13 18:33:47.951395782 +0800
     Birth: -
    

    cut 命令

    可以让每行字符按照特定的格式输出,例如我们刚才的 /etc/passwd 文件,如果我们只看用户名的话,直接使用 cat 可能会让控制台多出很多无关的字符:

    cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ....
    

    使用 cut 可以帮我们过滤很多噪音数据

    cut -d: -f1 /etc/passwd
    root
    bin
    daemon
    adm
    

    diff 命令

    可以比较多个文件之间的差异,还可以使用 --brief 来比较文件是否相同,不过很多场地可以被 git diff 来替代,我简单创建 2 个文件看看示例:

    diff -c ip_address ip_address_2
    *** ip_address	Sun Jun 13 18:33:47 2021
    --- ip_address_2	Sun Jun 13 19:49:37 2021
    ***************
    *** 1 ****
    --- 1,2 ----
      192.168.0.0
    + 192.168.100.100
    

    文件目录管理

    这里主要描述对文件的创建、修改、复制、剪切、更名、删除等操作

    touch 命令

    touch 可以创建空白文件,这里就不介绍了,现在基本都在使用 vim fileName 命令创建并编辑文件了,touch 主要还是用于修改文件的时间戳:

    # 创建一个当前文件
    echo "hello world" >> hello.cfg
    
    ls 
    # 查看时间戳
    -rw-r--r-- 1 root root 12 Jun 13 20:06 hello.cfg
    
    # 使用 touch 让它时光倒流
    touch -d "2017-06-13 20:00" hello.cfg
    
    ls
    # 文件时间已被修改
    -rw-r--r-- 1 root root 12 Jun 13  2017 hello.cfg
    

    mkdir 命令

    就创建一个目录,这没啥好说的。。

    mkdir demo_directorie
    drwxr-xr-x 2 root root  6 Jun 13 20:11 demo_directorie
    

    cp 命令

    就是复制文件和目录,命令格式:cp[选项]用法也很简单:

    # 复制 hello.cfg  文件,新文件命名 h2.cfg
    cp hello.cfg h2.cfg
    # 复制 text_edit/ 目录
    cp -r text_edit/ t2
    

    更多选项参数可以使用 man 查看

    mv 命令

    就是移动文件,如果文件目录不变则视为重命名操作,示例:

    ls /home  # 查看空目录
    mv h2.cfg /home # 把当前目录下文件移动到 /home 目录下
    ls /home # h2.cfg 移动过来
    h2.cfg
    
    cd /home
    mv h2.cfg h5.cfg # 重命名操作
    

    rm 命令

    常用的主要是删除文件、目录,Linux 从安全考虑每次删除都会询问,如下:

    rm h5.cfg
    rm: remove regular file 'h5.cfg'?
    

    如果你觉得烦,并且确认删除操作安全的话,可以加上 -f 选项参数避开这个提示,另外删除目录也需要加 -r 来表示递归操作,示例:

    # 递归删除 /text_edit 目录,并且不提示
    rm -rf text_edit
    

    dd 命令

    比较有意思的命令,可以指定大小的数据块来复制文件,官方对它的解释是:

    Copy a file, converting and formatting according to the operands.

    这命令用得少,但是我们还是可以了解一下基本玩法的,例如我们可以从 /dev/zero 里面抽取一个指定大小的数据块(随便来一个 500M 吧),我们看示例

    dd if=/dev/zero of=500_file count=1 bs=560M
    1+0 records in
    1+0 records out
    587202560 bytes (587 MB, 560 MiB) copied, 4.3654 s, 135 MB/s
    

    dd 的功能还不止复制这么简单,有时候可以把抽取的数据制作成其他格式文件,例如 ISO 这在 Windows 要借助第三方专业软件才能做到,因为很少用,这里就不详细展开了

    file 命令

    由于 Linux 系统所有一切都成为文件,而且单凭后缀无法区分具体类型的时候,就需要 file 命令来查看文件类型了:

    # 数据类型
    file 500_file
    500_file: data
    
    # 文本类型
    echo 'hello world' >> h2.txt
    file h2.txt
    h2.txt: ASCII text
    

    打包压缩与搜索

    网上下载软件包安装,或者把 Linux 文件打包发给别人,都离不开压缩/解压命令,所以这里也很重要,值得了解一下

    tar 命令

    主要对文件压缩/解压操作,虽然网上的压缩格式比较多,但基本都是 tar 衍生出来的,所以不用担心要记太多的命令,用好 tar 就可以了,我们先看压缩示例代码,后面再讲参数详情,这样会比较有趣一点

    # 压缩 /etc 目录到 etc.tar.gz
    tar -czvf etc.tar.gz /etc
    
    /etc/
    /etc/mtab
    /etc/fstab
    /etc/crypttab
    ....
    
    # 打包完成后,可以在当前目录看到压缩文件
    ll -h
    -rw-r--r-- 1 root root 5.2M Jun 13 22:44 etc.tar.gz
    

    那么如何把文件解压到指定目录呢 ?请看示例代码

    # 解压文件到 /root/etc 目录
    tar -xzvf etc.tar.gz -C /root/etc
    
    etc/
    etc/mtab
    etc/fstab
    etc/crypttab
    etc/resolv.conf
    .....
    

    压缩和解压命令参数都比较长,压缩用 -czvf 解压用 -xzvf,他们各自的具体含义,我们看看 tar 比较常用的选项参数的含义:

    • -c 压缩文件
    • -x 解压文件
    • -t 查看压缩包的文件
    • -z 使用 Gzip 压缩/解压(常用)
    • -v 显示压缩/解压的过程(墙裂推荐)
    • -f 目标的文件名
    • -C 解压到指定目录

    还有很多不常用的参数,可以使用 man 查看文档

    grep 命令

    对于很多需要文本搜索的场景都会用到 grep,大多会配合管道 | 使用,grep 很少会配合选项参数使用,后面简单介绍几个常用的选项参数,如果嗨还有兴趣的话可以通过 man grep 命令保存,示例程序:

    # 使用 grep 过滤不允许再登陆系统的用户
    cat /etc/passwd | grep /sbin/nologin
    
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    

    一些常用的选项参数:

    • -b 将 binary 文件当作 text 来搜索
    • -c 仅显示匹配文本的行数
    • -i 忽略大小写
    • -n 显示行号
    • -v 反向,列出没有"关键字"的行

    find 命令

    搜索工作一般都是通过 find 命令来完成的,它可以通过多维度来搜索文件(名称,大小,时间,权限等),我们先看一个简单的示例:

    # 特定目录下的 文件模糊匹配 (不想限制目录的话,可以移除)
    find /root -name 'phoenix*'
    
    # 匹配项
    /root/.halo/upload/2021/03/phoenix_logo-332a6c083168451a9887c3d9cd675993.jpg
    /root/.halo/upload/2021/03/phoenix_logo-332a6c083168451a9887c3d9cd675993-thumbnail.jpg
    /root/phoenix.txt
    

    通过权限搜索(我暂时想不到有什么使用场景)

    find / -perm -4000
    
    /var/lib/docker/overlay2/bcb0d4a5d9a0c29cd9f022....
    /var/lib/docker/overlay2/bcb0d4a5d9a0c29cd9f022....
    ......
    

    find 常用的选项参数:

    • -name 名称匹配
    • -perm 权限匹配
    • -user 用户匹配
    • -group 用户组匹配
    • -size 匹配文件大小

    .... 更多参数还是要用的时候再查文档。

    到这里差不多,有点累,我要休息一下了。

  • 相关阅读:
    【PHP】window系统中设置计划任务,定时调用某接口
    【php】在laravel中使用 easy-wechat实现企业付款到零钱
    【转载】laravel中使用WangEditor及多图上传
    [PHP] curl: (60) SSL certificate problem: unable to get local issuer certificate
    阿里云服务器win10 访问服务器图片资源提示 401
    【PHP】创瑞短信接口
    C#中Lock锁的对象选择问题
    TCP三次握手,四次挥手异常情况(坑)
    C# Hashtable、HashSet和Dictionary的区别
    浅析C# Dictionary实现原理
  • 原文地址:https://www.cnblogs.com/xiao2shiqi/p/14881604.html
Copyright © 2020-2023  润新知