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

2021-06-29 15:03:27 浏览数 (1)

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

命令格式和帮助信息

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

代码语言:javascript复制
命令名称 [命令参数] [命令对象]

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

代码语言:javascript复制
# 长格式:
man --help

# 短格式
man -h

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

按键

用途

Page down

下一页

Page up

上一页

home

首页

end

页尾

/

从上往下搜索关键字

?

从下往上搜索关键字

n

定位到下一个关键字

N

定位到上一个关键字

q

退出帮助文档

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

代码语言:javascript复制
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 命令

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

代码语言:javascript复制
echo "hello world"
hello world

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

代码语言:javascript复制
echo $SHELL
/bin/bash
data 命令

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

代码语言:javascript复制
data
Sun Jun 13 09:19:33 CST 2021

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

代码语言:javascript复制
date " %Y-%m-%d %H:%M:%S"
2021-06-13 09:23:12

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

代码语言:javascript复制
date -s "20210613 9:27:00"
Sun Jun 13 09:27:00 CST 2021
wget 命令

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

代码语言:javascript复制
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]

然后我们查看目录

代码语言:javascript复制
ls
LinuxProbe.pdf

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

参数

作用

-b

后台下载

-P

指定目录

-t

尝试次数

-r

递归下载

|-p

下载所有资源

ps 命令

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

代码语言:javascript复制
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 里面的活动监视器,字段详情如下:

代码语言:javascript复制
# 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,如下:

代码语言:javascript复制
pidof mongod
226807
kill 命令

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

代码语言:javascript复制
kill 226807
killall 命令

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

代码语言:javascript复制
pidof httpd
13581 13580 13578 13577
killall httpd

状态检测命令

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

ifconfig 命令

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

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

我们看一个示例:

代码语言:javascript复制
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 似乎没有任何意义,如下:

代码语言:javascript复制
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 文件,命令如下:

代码语言:javascript复制
cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
uptime 命令

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

代码语言:javascript复制
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 更符合人类的阅读习惯,如下:

代码语言:javascript复制
total        used        free      shared  buff/cache   available
Mem:          1.7Gi       751Mi       113Mi       2.0Mi       858Mi       813Mi
Swap:            0B          0B          0B

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

who 命令

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

代码语言:javascript复制
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 命令

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

代码语言:javascript复制
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 变量(其实大多数场景下够用了),甚至大多数场景都是比较多的,我通常还会在后面增加数组选项来限制它的输出,如下:

代码语言:javascript复制
history 5
325  history 15
326  clear
327  man history
328  history
329  history 5

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

代码语言:javascript复制
cat ~/.bash_history

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

代码语言:javascript复制
history -c
sosreport 命令

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


工作目录命令

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

pwd 命令

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

代码语言:javascript复制
pwd
/root
cd 命令

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

代码语言:javascript复制
cd /etc   # 进入 /etc 目录
cd /bin   # 进入 /bin 目录
cd ..     # 切换到当前目录的上一级
cd ~      # 切换到当前用户目录的根目录
ls 命令

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

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

示例:

代码语言:javascript复制
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 选项参数还能看到行号,如下:

代码语言:javascript复制
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 有如下优势:

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

大概是这样

代码语言:javascript复制
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 参数指定输出的行数,效果如下:

代码语言:javascript复制
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 参数可以实时监控输出,所以用于查报错日志,监控日志输出的时候特别有用,也是平时在服务器上很常用的一个命令

代码语言:javascript复制
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 只显示字节数

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

代码语言:javascript复制
wc dnf.log
8863  71220 682533 dnf.log

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

代码语言:javascript复制
wc -l /etc/passwd
29 /etc/passwd
stat 命令

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

代码语言:javascript复制
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 可能会让控制台多出很多无关的字符:

代码语言:javascript复制
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 可以帮我们过滤很多噪音数据

代码语言:javascript复制
cut -d: -f1 /etc/passwd
root
bin
daemon
adm
diff 命令

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

代码语言:javascript复制
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 主要还是用于修改文件的时间戳:

代码语言:javascript复制
# 创建一个当前文件
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 命令

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

代码语言:javascript复制
mkdir demo_directorie
drwxr-xr-x 2 root root  6 Jun 13 20:11 demo_directorie
cp 命令

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

代码语言:javascript复制
# 复制 hello.cfg  文件,新文件命名 h2.cfg
cp hello.cfg h2.cfg
# 复制 text_edit/ 目录
cp -r text_edit/ t2

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

mv 命令

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

代码语言:javascript复制
ls /home  # 查看空目录
mv h2.cfg /home # 把当前目录下文件移动到 /home 目录下
ls /home # h2.cfg 移动过来
h2.cfg

cd /home
mv h2.cfg h5.cfg # 重命名操作
rm 命令

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

代码语言:javascript复制
rm h5.cfg
rm: remove regular file 'h5.cfg'?

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

代码语言:javascript复制
# 递归删除 /text_edit 目录,并且不提示
rm -rf text_edit
dd 命令

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

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

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

代码语言:javascript复制
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 命令来查看文件类型了:

代码语言:javascript复制
# 数据类型
file 500_file
500_file: data

# 文本类型
echo 'hello world' >> h2.txt
file h2.txt
h2.txt: ASCII text

打包压缩与搜索

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

tar 命令

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

代码语言:javascript复制
# 压缩 /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

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

代码语言:javascript复制
# 解压文件到 /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 命令保存,示例程序:

代码语言:javascript复制
# 使用 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 命令来完成的,它可以通过多维度来搜索文件(名称,大小,时间,权限等),我们先看一个简单的示例:

代码语言:javascript复制
# 特定目录下的 文件模糊匹配 (不想限制目录的话,可以移除)
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

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

代码语言:javascript复制
find / -perm -4000

/var/lib/docker/overlay2/bcb0d4a5d9a0c29cd9f022....
/var/lib/docker/overlay2/bcb0d4a5d9a0c29cd9f022....
......

find 常用的选项参数:

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

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

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

0 人点赞