1.1 系统管理类命令

在计算机发展初期,计算机之庞大以吨为计。因此计算机都是放到一个单独的房间中,人们在另一个地方通过一定的方式(设备)去操控计算机,操控计算机的这个设备被称为终端,也叫终端机。终端其实就是一种输入输出设备,本身并不提供运算处理功能。

后来随着个人计算机的普及,终端的含义也慢慢出现了变化。因为个人计算机不再需要一个额外的终端来操作计算机,所有操作都在个人计算机上完成了。但是,计算机操作系统中已有的终端设计却保留了下来,并以终端模拟器(Terminal Emulator)的形式出现。这些终端模拟器被简称为终端。 如今,用户打开电脑后,会直接进入图形化 shell 与计算机交互。

本节的基础系统管理类命令以 CentOS Linux 8 为例。

Tux,Linux 的吉祥物

主机名称

大多数 Linux 发行版中,都使用hostname命令查看或更改主机名。主机名用于标识网络中的计算机,以便其他计算机可以识别和访问它。修改主机名需要重新登陆后才能生效。

[zhangzh@node01 ~]$ hostnamectl
   Static hostname: node01
         Icon name: computer-server
           Chassis: server
        Machine ID: 6c1247f5013f4ea08698f184fd35efb8
           Boot ID: 831d4163ee26402e88b8325ef19b406c
  Operating System: CentOS Linux 8
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-240.el8.x86_64
      Architecture: x86-64
[zhangzh@node01 ~]$ hostnamectl set-hostname newname

直接以管理者 root 身份操作 shell 是危险的,所以计算机用户通常以普通用户登陆或访问:[zhangzh@node01 ~]$分别表示以普通用户zhangzh登录,主机名是node01root用户登陆时$会变为#以示区分。

电源管理

服务器和电脑都是计算机的一种形式,都可以开关机和重启:

重启命令 e.g.

[zhangzh@node01 ~]$ bash          # 仅适用于账户的重启
[zhangzh@node01 ~]# reboot now    # 适用于对服务器的重启

关闭命令 e.g.

[zhangzh@node01 ~]# shutdown now    # 立刻关机
[zhangzh@node01 ~]# shutdown 20:30  # 今晚八点半关机
[zhangzh@node01 ~]# shutdown +20    # 20min后关机

密码设置

passwd命令 设置用户的认证信息,包括用户密码、密码过期时间等。只有 root 用户可以指定用户名称或者修改密码,普通用户只能修改自己的密码。

修改其他用户的密码方式参考本章用户管理一节;找回 root 密码的方法参考这篇博客

远程控制

ssh命令 用来远程连接服务器,启动 X11 服务(即调用 GUI)时需要额外添加-XY 参数。e.g.

[zhangzh@node01 ~]$ ssh -p 8022 zhangzh@222.2.2.102    # -p:指定端口号

在 macOS 中开启 X11 转发服务方法可以参考:使用XQuartz调用GUI界面

每次输入密码登陆未免太过麻烦,解决方法是在可以信任的计算机上设置免密登陆。

在可以信任的计算机上执行ssh-keygen命令,生成 ssh 钥匙。macOS 下钥匙的路径存放在.ssh/。e.g.

local$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):    <====空格
Enter same passphrase again:                   
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:47VkvSjlFhKRgz/6RYdXM2EULtk9TQ65PDWJjYC5Jys user@local
The key's randomart image is:
+---[RSA 2048]----+
|       ...o...X+o|
|      . o+   B=Oo|
|       .....ooo*=|
|        o+ooo.+ .|
|       .SoXo.  . |
|      .E X.+ .   |
|       .+.= .    |
|        .o       |
|                 |
+----[SHA256]-----+

接下来将公钥内容拷贝至需要控制的服务器即可。e.g.

ssh zhangzh@222.19.64.20 -p 8022 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

配置登陆服务器名称:

将远程服务器命名为klcr, 在配置文件中.ssh/config写入:

Host klcr
	Hostname 222.19.64.20
	Port 8022
	User zhangzh
	IdentityFile ~/.ssh/id_rsa

至此,就完成了服务器的别名配置,输入ssh klcr即可免密访问服务器。

在终端中上传和下载本地或服务器的文件方法参考跨服务器传输文件章节。

启动服务

不同系统的服务启动指令略有差异,本系统使用systemctl start git启动。e.g.

[zhangzh@node01 ~]$ systemctl start yum
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to start 'yum.service'.
Authenticating as: root

用户管理

用户管理涉及到用户以及权限的概念。通常用户只对自己的文件具有完整的权限,同组用户拥有相对完整的权限,对组外(其他)用户则不具备任何权限。

useradd命令 建立用户帐号。

usermod命令 修改用户帐号。

userdel命令 删除用户帐号。

组管理命令:

# groupadd groupname                 # 新建用户组
# groupadd -n groupname newgroupname # 修改用户组名称
# groupdel groupname                 # 删除用户组

用户管理命令:

# useradd username                   # 新建用户
# useradd -d /home/users username    # 指定根目录创建用户
# useradd -g groupname username      # 新建用户并指定用户组
# usermod -g groupname username      # 为新建用户指定用户组
# passwd username                    # 修改用户密码
# userdel -r username                # 删除用户及主目录
# whois username                     # 查询用户

可能出现的错误:

创建用户时出现 Creating mailbox file: File exists 的错误。直接删除 /var/spool/mail/ 和 /home 下的之前存在的用户文件,删除后就能重建成功。

e.g. 简单创建用户流程
[root@node02 l]# useradd -d /home/users/l/lixl lixl
[root@node02 l]# ls
lixl
[root@node02 l]# passwd lixl
Changing password for user lixl.
New password: 
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@node02 l]# usermod -g ybj lixl
[root@node02 l]# ll
total 4
drwx------ 3 lixl ybj 4096 Aug  1 13:40 lixl
[root@node02 l]#

su命令(switch uesr)用于变更使用者身份。常见用法如:su username或者su -c command username,其含义分别是切换至用户名为username的账户和切换至username的账户后执行命令后退出该账户。

进程管理

top命令 实时查看系统的运行情况。可以个性化top界面如:按z更改界面颜色,按 shift+z,依次点按S和数字0-7可以更改对应位置的字体颜色,按tm可以切换显示 CPU、GPU 的占用情况,按回车后按W保存。

w命令 显示登陆系统的用户列表,显示用户正在执行的进程,登陆地点,登陆时间等等信息。

 -f, --from          显示用户从哪登录;
 -i, --ip-addr       显示IP地址而不是主机名(如果可能)
     --help          显示此帮助并退出

还可用于查看系统时间,这一点和uptime作用一致。e.g.

:17 up 10 days, 16:30,  6 users,  load average: 0.00, 0.00, 0.00
Tasks: 1162 total,   1 running, 1161 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 257284.2 total, 231838.1 free,   3752.3 used,  21693.8 buff/cache
MiB Swap:  30517.0 total,  30517.0 free,      0.0 used. 251483.6 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND              
     12 root      20   0       0      0      0 I   0.3   0.0  35:25.93 rcu_sched            
   2988 rngd      20   0  376296   8608   5492 S   0.3   0.0   4:53.00 rngd                 
2070853 zhangzh   20   0  276376   6572   4604 R   0.3   0.0   0:00.36 top                  
      1 root      20   0  243500  11876   8304 S   0.0   0.0   1:01.35 systemd              
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.86 kthreadd             
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp               
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp           
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H         

更多关于时间的命令可以参考附录

jobs命令 显示作业的状态,如列出活动的作业、列出停止的作业。

jobs常用参数是jobs -l以包含pid的形式展示进程,需要注意的是jobs只能查看当前的账户进程,如果使用诸如nohup之类的命令来不中断在后台完成进程,jobs -l命令可能无法查询到,这时候就需要使用ps命令来查看。

ps命令(process status)报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。如:ps -aux配合grep命令查找需要的进程,并打印 ID 号和所属用户。

pstree命令 以一种优雅的方式展示进程树。

当进程严重影响到服务器的运行状态时,可以指定结束特定用户的特定进程。

pkill命令 按照进程名杀死进程。pkillkillall应用方法差不多,也是直接杀死运行中的程序;如果想杀掉单个进程,用kill

kill命令 通过进程 ID (Progress ID, PID)关闭进程。使用kill -9命令立即杀死指定 PID 的进程。使用ps等命令配合grep来查找进程 ID。

killall命令 关闭指定用户名称的所有进程。

# pkill -u username
# killall -u username

进程中无法输入 kill 时,使用如下命令中止或挂起进程。

ctrl c     # 中断进程,如无法中断时
ctrl z     # 命令可以将进程调入后台,可以使用fg和bg命令前台或后台继续该任务
ctrl \     # 命令可以直接退出当前程序 

当需要kill某项进程时,请先kill该进程之前的进程,否则可能会报错,如nohup ping,应先kill ping,再kill nohup。

配置文件

环境变量(environment variable)是用来存储有关 shell 会话和工作环境的信息的一种特性。

这项特性允许在内存中存储数据以便程序或 shell 中运行的脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。

根据作用域的不同,环境变量分为两种:全局环境变量 和局部环境变量使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符$ e.g.

[zhangzh@node01 sshpass-1.08]$ echo $HOME
/home/users/z/zhangzh

在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。e.g.

[zhangzh@node01 sshpass-1.08]$ ls $HOME
asgamma  bin  grb  other  practice  software  wl
[zhangzh@node01 sshpass-1.08]$ ls /home/users/z/zhangzh/
asgamma  bin  grb  other  practice  software  wl

一旦启动了 bash shell(或者执行一个 shell 脚本),就能创建在这个 shell 进程内可见的局部变量了。可以通过=给环境变量赋值,值可以是数值或字符串,如果要给变量赋一个含有空格的字符串值,必须用引号来界定字符串的首和尾。e.g.

[zhangzh@node01 sshpass-1.08]$ echo $my_var          # 为定义的变量会返回空值                                                                                                                               
                                                                
[zhangzh@node01 sshpass-1.08]$ my_var=hello
[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello
[zhangzh@node01 sshpass-1.08]$ my_var=hello world    # 没有单引号的话,bash shell会以为下一个词是另一个要执行的命令
bash: world: 未找到命令...
[zhangzh@node01 sshpass-1.08]$ my_var="hello world"
[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello world
[zhangzh@node01 sshpass-1.08]$ my_var='hello linux'  # 单双引号不做区别
[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello linux
[zhangzh@node01 sshpass-1.08]$ 

设置了局部环境变量后,就能在 shell 进程的任何地方使用它了。但是,如果生成了另外一个 shell,它在子 shell 中就不可用。e.g.

[zhangzh@node01 sshpass-1.08]$ my_var='hello linux'
[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello linux
[zhangzh@node01 sshpass-1.08]$ bash    # 新建bash会话
[zhangzh@node01 sshpass-1.08]$ echo $my_var

[zhangzh@node01 sshpass-1.08]$ 

在子 shell 中无法使用用户定义变量my_var。通过命令echo $my_var所返回的空行就能够证明这一点。当退出子 shell 并回到原来的 shell 时,这个局部环境变量依然可用,类似地,如果在子进程中设置了一个局部变量,那么一旦退出了子进程,那个局部环境变量就不可用。

那么需要该变量在所有进程中都是可见的,就需要设置全局变量。

创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中,这个过程通过export命令来完成,变量名前面不需要加$

[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello linux
[zhangzh@node01 sshpass-1.08]$ export my_var
[zhangzh@node01 sshpass-1.08]$ bash
[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello linux

修改子 shell 中全局环境变量并不会影响到父 shell 中该变量的值,子 shell 甚至无法使用export命令改变父 shell 中全局环境变量的值,甚至子 shell 重新定义并导出了变量my_var,但父 shell 中的my_var变量依然保留着原先的值。

当然,既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用unset命令完成这个操作。在unset命令中引用环境变量时,记住不要使用$

[zhangzh@node01 sshpass-1.08]$ echo $my_var
hello linux
[zhangzh@node01 sshpass-1.08]$ unset my_var
[zhangzh@node01 sshpass-1.08]$ echo $my_var

[zhangzh@node01 sshpass-1.08]$ 

如果子进程中删除了一个全局环境变量, 这只对子进程有效。该全局环境变量在父进程中依然可用。

默认的环境变量有很多,在这里查看全部的默认变量,这里列出一些常用的环境变量名称:

常用环境变量
作用

PATH

决定了shell将到哪些目录中寻找命令或程序

LIBRARY_PATH

用于在程序编译期间查找动态链接库时指定查找共享库的路径

LD_LIBRARY_PATH

用于在程序加载运行期间查找动态链接库时指定查找共享库的路径

INCLUDE

用于在程序编译期间查看头文件的路径

PBS_O_HOST

提交作业的主机名

PBS_O_WORKDIR

提交作业的工作路径

PBS_JOBID

作业被PBS系统指定的作业号

PBS_QUEUE

PBS脚本在执行时的队列名

PBS_NODEFILE

PBS系统指定的作业运行的节点名

使用:在 shell 命令行界面中输入一个外部命令时,shell 必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。例如,输出中显示了有 8 个可供 shell 用来查找命令和程序。PATH中的目录使用冒号分隔。

[zhangzh@node01 ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: 10 /sbin:/bin:/usr/games:/usr/local/games
[zhangzh@node01 ~]$

如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。如果shell找不到指定的命令或程序,它会产生一个错误信息(建议都使用绝对路径):

[zhangzh@node01 ~]$ myprog
-bash: myprog: command not found $

登入 Linux 系统启动一个 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件叫作启动文件或环境文件。大多数 Linux 发行版只用这四个启动文件中的一到两个:

$HOME/.bash_profile、$HOME/.bashrc、$HOME/.bash_login、$HOME/.profile

这四个文件都以点号开头,这说明它们是隐藏文件(不会在通常的ls命令输出列表中出现)。它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动 bash shell 会话时生效。

当在登录时echo一些个性化的内容,如登录信息,应该将脚本添加在$HOME/.bash_profile中,而不得添加在$HOME/.bashrc中,因为在使用sftp等需要按行查看登录环境的命令时,echo会打乱其读取的内容,导致连接失败。

ls命令(list files) 可以打印出当前工作目录下的所有文件(目录/地址也是一种文件)。

echo命令 用于在shell中打印shell变量的值,或者直接输出指定的字符串。

服务查询

systemctl status 是一个用于在 Linux 系统上查看服务状态的命令。它可以显示特定服务的详细信息,包括当前是否正在运行、最后一次启动时间、PID、主机名称等。e.g.

[zhangzh@node01 ~]# systemctl status firewalld.service 
?.firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enable>
   Active: active (running) since Mon 2022-04-18 10:56:12 CST; 1 weeks 0 days ago
     Docs: man:firewalld(1)
 Main PID: 3056 (firewalld)
    Tasks: 2 (limit: 1645568)
   Memory: 40.3M
   CGroup: /system.slice/firewalld.service
           ?..3056 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

地址与端口

  • 地址:地址通常指的是 IP 地址,它是用来唯一标识网络中的设备(例如计算机、路由器、服务器等)的,使得数据能够正确地发送和接收。IP 地址可以分为 IPv4 地址(如 192.168.1.1)和 IPv6 地址(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。

  • 端口:端口是一个用来标识应用程序或服务的逻辑通道。在网络通信中,数据包通过端口来确定应该传递给哪个应用程序或服务。端口号是一个 16 位的数字,范围从 0 到 65535。其中,0 到 1023 的端口号是被预留给一些知名的服务(例如 HTTP 服务的端口号是 80,HTTPS 服务的端口号是 443)。一般情况下,用户自定义的应用程序会使用大于 1023 的端口号。

因此,地址和端口在网络通信中起着非常重要的作用,地址用于标识设备,而端口则用于标识设备上的应用程序或服务。

$ ifconfig        # 查看本机IP
$ netstat -aptn   # 查看本机端口号
$ ping ip         # 查看地址是否联通
$ telnet ip post  # 含端口号查看地址

路径与文件

路径是文件(目录也是文件)在 Linux 系统中的唯一位置。Linux 中路径分为两种:

  • 绝对路径 :是完全限定名称从根目录 / 开始,指定到达唯一单个文件所需要遍历的每个子目录;

  • 相对路径: 仅指定从工作目录到达该文件所需的路径。

cd命令(change directory)命令用于改变当前工作目录的命令,切换到指定的路径,如cd ~意为切换到家目录,cd .切换至当前工作目录,cd ..切换至工作目录的上一级目录。

通配符与正则表达

在前面的介绍中,或多或少已经接触了一些通配符与正则表达,二者是 Linux 中最强大的工具,虽然规则很多,但是值得反复学习和使用,受益终身。

通配符用于匹配文件名。比如find,ls,cp,mv等命令支持通配符查找文件名。

符号
解释

*

匹配任何字符。rm *.txt删除当前目录下的所有以.txt结尾的文件

?

匹配单个字符。ls file?.txt 将匹配 file1.txtfile2.txt 等文件

[-]

范围匹配。rm [a-z].txt删除当前目录下的包含小写字母的文件,举一反三,[a-zA-Z0-9]意为匹配所有大小写字母和阿拉伯数字

{,}

选项匹配。touch {a..z}.txt按字母顺序创建名为a.txtz.txt,删除同理,touch {a.txt,b.txt}创建名为a.txtb.txt的文件,cp a{.c,.c.bak}a.c创建名为a.c.bak的备份文件

\

转义字符。转为表达字符的原始含义用ls \*.txt 将匹配以 *.txt 结尾的文件

!

取反匹配,[!abc]表示不包含abc中的任何字母

^

同上

e.g. 通配符使用
[zhangzh@node01 ~]$ touch lab{1..20}
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab1
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab10
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab11
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab12
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab13
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab14
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab15
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab16
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab17
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab18
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab19
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab2
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab20
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab3
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab5
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab6
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab7
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab8
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab9
drwx------ 2 zhangzh ybj 4096 May  7 18:16 linux
[zhangzh@node01 ~]$ rm -rf lab1?
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab1
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab2
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab20
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab3
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab5
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab6
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab7
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab8
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:43 lab9
drwx------ 2 zhangzh ybj 4096 May  7 18:16 linux
[zhangzh@node01 ~]$ rm -rf lab*
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May  7 18:16 linux 18:16 linuxsh
[zhangzh@node01 ~]$ touch {laab,lab11}
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:47 laab
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:49 laab1
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:46 lab1
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:47 lab11
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:46 lab2
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:46 lab3
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:46 lab4
-rw-r--r-- 1 zhangzh ybj    0 May  8 13:46 lab5
drwx------ 2 zhangzh ybj 4096 May  7 18:16 linux
[zhangzh@node01 ~]$ ls l?b1
lab1
[zhangzh@node01 ~]$ ls l*b1
laab1  lab1
[zhangzh@node01 ~]$ ls l?b*
lab1  lab11  lab2  lab3  lab4  lab5
[zhangzh@node01 ~]$ ls lab*    # 取反查找
lab1  lab11  lab2  lab3  lab4  lab5
[zhangzh@node01 ~]$ ls lab[^1]
lab2  lab3  lab4  lab5

正则表达式元字符有字符匹配、匹配次数、位置锚定、分组。主要是处理文本里的内容,用来匹配文本里的字符串,针对文件内容的文本过滤工具里,大都用到正则表达式,如grep,sed,awk,vim, less,nginx,varnish等命令支持正则表达式。

符号
解释

.

匹配任意单个字符

*

匹配0个或多个前面的字符

+

匹配1个或多个前面的字符

匹配1次或0次前面的字符

()

分组过滤,被括起来的内容表示一个整体

|

匹配多个模式中的一个

^

匹配行的开头。grep '^start' file.txt 将匹配以 start 开头的行

$

匹配行的结尾。grep 'end$' file.txt 将匹配以 end 结尾的行

\b

匹配单词的边界。grep '\bword\b' file.txt 将匹配独立的单词 word

\d

匹配数字字符。grep '\d+' file.txt 将匹配一个或多个数字。

\w

匹配字母数字字符。grep '\w+' file.txt 将匹配一个或多个字母数字字符

\s

匹配空白字符。grep 'line\s+' file.txt 将匹配以 line 开头的行,并跟随一个或多个空白字符

{n}

匹配前面的元素恰好 n 次。grep 'a{3}' file.txt 将匹配 aaa

{n,}

匹配前面的元素至少 n 次。grep 'a{2,}' file.txt 将匹配至少两个连续的 a

{n,m}

匹配前面的元素至少 n 次,但不超过 m 次。grep 'a{2,4}' file.txt 将匹配两个到四个连续的 a

根目录结构

Linux 的根目录通常有这些文件构成,它们的作用分别是:

/bin       存放普通用户所使用的命令;以二进制(binary)存储
/boot      操作系统的启动文件;
/dev       系统可识别的设备目录;
/etc       服务配置文件,yum安装地址;
/home      普通账号的家目录;
/lib       存放库文件.os;
/media     软硬盘挂载点;            
/opt       安装大型软件;
/proc/sys  虚拟内存,正在运行的信息被映射至这两个目录;
/tmp       临时文件存放目录;
/var       日志目录

软件编译

GNU编译器

GCC(GNU Compiler Collection,GNU编译器套件)

  • GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 计划的关键部分,亦是自由的类 Unix 及苹果电脑 macOS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准

  • GCC 可处理 C、C++、Fortran、Pascal、Objective-C、Java 以及 Ada 等语言

从 github 中下载一个开源软件(或者库),通常需要“三连”安装(使用cmake或其他指定编译安装命令的除外)

[zhangzh@node01 ~]$ ./configure
[zhangzh@node01 ~]$ make
[zhangzh@node01 ~]$ make install 

此时该开源软件的会默认安装到/usr/local/lib/usr/local/include

如果想指定安装位置(比如库文件将要做到docker镜像中,或者加入到git仓库中,需要独立出来),可以通过一下方式指定:make DESTDIR=/install/directory install

随后在.bashrc中指定环境变量地址即可。

参考:

添加媒体

Linux 中,“媒体”指的是存储介质,如光盘、USB 闪存驱动器、硬盘等,用于安装、存储和传输数据。媒体通常需要被挂载到系统中,以便用户访问和操作。步骤是(属于临时挂载):

1、插入媒体(u盘)到计算机,通常它的硬件名称为:sda1,可以用fdisk -l来查看当前的硬件名称

2、mnt目录下先建立一个 usb 的目录,如# mkdir /mnt/usb

3、挂载媒体:mount -t vfat /dev/sda1 /mnt/usb

4、卸载媒体:umount /mnt/usb

5、删除 usb 目录:rm -rf /mnt/usb

非临时挂载需要在vi /etc/fstab中修改配置,配置在重启后才能生效。

当发现无法卸载某个媒体,尝试使用fuser -km关闭所有进程。

配置别名

alias命令 创建常用命令的快捷形式,二者输入效果等价。例如:alias ll='ls -latr' 创建了一个命令别名 ll等价于ls -latr,每次配置别名仅在当前 bash 中生效,把别名保存在 ~/.bashrc中将全局生效,具体参考这篇文章

Last updated