程序项目代做,有需求私信(vue、React、Java、爬虫、电路板设计、嵌入式linux等)

Linux 常用终端命令整理

linux系统中提供了大量的命令,该文整理了一份使用较为频繁的命令,并且我们对命令进行了一个详细的分类。

一 、Linux命令格式

1.1 Linux终端命令格式

终端命令格式:

command [options] [parameter]

说明:

  • command :命令名,相应功能的英文单词或单词的缩写;
  • [options] :选项,可用来对命令进行控制,也可以省略;
  • parameter :传给命令的参数,可以是 零个、一个 或者 多个;

在linux命令行中,命令的参数有的时候是一个连字符,有的时候是两个连字符。

对于options类型参数可以有两种方式:

  • 短选项(short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母),例如:-s,-h等。
  • 长选项(long options):长选项,包含了两个连字号和一些大小写字母组成的单词,例如:--size,--help等。

注:

  1. 一个程序通常会提供包括short options和long options两种参数形式的参数,short options一般是其对应的long options的开头字母。

  2. - 和--可以用来做区分sh是一个选项还是两个选项s和h的组合。-sh是s和h的组合 --sh则说明sh是单一的选项。

1.2 查阅命令帮助信息

--help:显示 command 命令的帮助信息;

[root@longmax2002 ~]# ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print C-style escapes for nongraphic characters
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
                               1,048,576 bytes; see SIZE format below
  -B, --ignore-backups       do not list implied entries ending with ~
  -c                         with -lt: sort by, and show, ctime (time of last

man:查阅 command 命令的使用手册,man 是 manual 的缩写,是 Linux 提供的一个手册,包含了绝大部分的命令、函数的详细使用;

man pwd

使用 man 时的操作键:

  • 空格键:显示手册页得下一屏;
  • Enter键:一次滚动手册页得一行;
  • b:回滚一屏;
  • f:前滚一屏;
  • q:退出;
  • /word:搜索word字符串;

二、文件相关命令

2.1 创建文件(touch)

touch命令:创建文件或修改文件时间,如果文件不存在,可以创建一个空白文件,如果文件已经存在,可以修改文件的末次修改日期。

[root@longmax2002 zy]# touch test
[root@longmax2002 zy]# ll
total 0
-rw-r--r-- 1 root root 0 Sep 29 13:18 test

2.2 创建目录(mkdir)

mkdir命令:创建一个新的目录。

选项含义
-p 可以递归创建目录

新建目录的名称不能与当前目录中已有的目录或文件同名。

[root@longmax2002 zy]# mkdir test
mkdir: cannot create directory ‘test’: File exists

2.3 删除文件/目录(rm)

rm命令:删除文件或目录,使用 rm 命令要小心,因为文件删除后不能恢复。

选项含义
-f 强制删除,忽略不存在的文件,无需提示
-r 递归地删除目录下的内容,删除文件夹时必须加此参数
rm -rf test

2.4 软/硬链接(ln)

命令:

ln -s 被链接的源文件 链接文件

建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式。

注意:

  1. 没有-s选项建立的是一个硬链接文件两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接。
  2. 源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用。

在 Linux 中,文件名和文件的数据是分开存储的:

提示:

  • 在 Linux 中,只有文件的 硬链接数 == 0 才会被删除。
  • 使用 ls -l 可以查看一个文件的硬链接的数量。
  • 在日常工作中,几乎不会建立文件的硬链接。

2.5 打包/解解包(tar)

打包压缩 是日常工作中备份文件的一种方式,在不同操作系统中,常用的打包压缩方式是不同的:

  • Windows 常用 rar。
  • Mac 常用 zip。
  • Linux 常用 tar.gz。

tar 是 Linux 中最常用的备份工具,此命令可以把一系列文件打包到一个大文件中,也可以把一个打包的大文件恢复成一系列文件。

tar 的命令格式如下:

# 打包文件
tar -cvf 打包文件.tar 被打包的文件/路径...
# 解包文件
tar -xvf 打包文件.tar

tar选项说明:

选项含义
c 生成档案文件,创建打包文件
x 解开档案文件
v 列出归档解档的详细过程,显示进度
f 指定档案文件名称,f 后面一定是 .tar 文件,所以必须放选项最后

注意: f 选项必须放在最后,其他选项顺序可以随意。

2.6 压缩/解压缩(tar)

tar 与 gzip 命令结合可以使用实现文件打包和压缩,tar 只负责打包文件,但不压缩,用 gzip 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.gz。

在 Linux 中,最常见的压缩文件格式就是 xxx.tar.gz。

在 tar 命令中有一个选项 -z 可以调用 gzip ,从而可以方便的实现压缩和解压缩的。

功能命令格式如下:

# 压缩文件
tar -zcvf 打包文件.tar.gz 被压缩的文件/路径...
# 解压缩文件
tar -zxvf 打包文件.tar.gz
# 解压缩到指定路径
tar -zxvf 打包文件.tar.gz -C 目标路径
选项含义
-C 解压缩到指定目录,注意:要解压缩的目录必须存在

tar 与 bzip2 命令结合可以使用实现文件打包和压缩(用法和 gzip 一样, tar 只负责打包文件,但不压缩,用 bzip2 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.bz2。

在 tar 命令中有一个选项 -j 可以调用 bzip2 ,从而可以方便的实现压缩和解压缩的功能。

命令格式如下:

# 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径...
# 解压缩文件
tar -jxvf 打包文件.tar.bz2

2.7 查看文件(cat、more)

cat 命令可以用来查看文件内容、创建文件、文件合并、追加文件内容 等功能。
cat 会一次显示所有的内容,适合查看内容较少的文本文件。

选项含义
-b 对非空输出行编号
-n 对输出的所有行编号
[root@longmax2002 zy]# cat -n test
     1  222
     2  3333
     3  444
     4  5655
     5  67777

Linux 中还有一个 nl 的命令和 cat -b 的效果等价。

more 命令可以用于分屏显示文件内容,每次只显示一页内容,适合于 查看内容较多的文本文件。

操作键功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串

2.8 查找文件(find)

find 命令功能非常强大,通常用来在特定的目录下,搜索符合条件的文件。

命令:

find [路径] -name “*.py”

查找指定路径下扩展名是 .py 的文件,包括子目录。

  • 如果省略路径,表示在当前文件夹下查找;
  • 通配符,在使用 find 命令时同时可用;

2.9 查看目录(ls)

ls 是英文单词 list 的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于 DOS下的 dir 命令。

  • Linux 文件或者目录名称最长可以有 256 个字符参数;
  • 以 . 开头的文件为隐藏文件,需要用 -a 参数才能显示;
  • . 代表当前目录;
  • … 代表上一级目录;

ls常用选项:

参数含义
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-l 以列表方式显示文件的详细信息
-h 配合 -l 以人性化的方式显示文件大小

ls通配符的使用:

通配符含义
* 代表任意个数个字符
? 代表任意一个字符,至少 1 个
[] 表示可以匹配字符组中的任一一个
[abc] 匹配 a、b、c 中的任意一个
[a-f] 匹配从 a 到 f 范围内的的任意一个字符

注意:以 . 开头的文件为隐藏文件,需要用 -a 参数才能显示。

[root@longmax2002 ~]# ls *
node-v12.18.1-linux-x64.tar.xz

logs:
nacos

nacos:
naming

node-v12.18.1-linux-x64:
bin  CHANGELOG.md  include  lib  LICENSE  README.md  share

tree 命令可以以树状图列出文件目录结构:

选项含义
-d 只显示目录

2.10 切换目录(cd)

cd 是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一。

命令含义
cd 切换到当前用户的主目录(/home/用户目录)
cd ~ 切换到当前用户的主目录(/home/用户目录)
cd . 保持在当前目录不变
cd … 切换到上级目录
cd - 可以在最近两次工作目录之间来回切换

相对路径和绝对路径:

  • 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对当前目录所在的目录位置;
  • 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从根目录/家目录开始的具体目录位置;

2.11 复制文件(cp)

cp 命令的功能是将给出的文件或目录复制到另一个文件或目录 中,相当DOS 下的 copy命令。

选 项含义
-i 覆盖文件前提示
-r 若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必
cp 源文件  目标文件(路径+可以重命名文件名)

2.12 移动文件(mv)

mv 命令可以用来移动文件或目录,也可以给文件或目录重命名。

选项含义
-i 覆盖文件前提示
mv 源文件  目标文件(路径+文件名)
mv 源文件  目标路径/

2.13 文本搜索(grep)

grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

选项含义
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(相当于求反)
-i 忽略大小写
-q 用于if判断,如果有匹配的内容立即返回0状态
-e 从文件内容查找与正则表达式匹配的行
-r 递归查找

常用的两种模式查找

参数含义
^a 行首,搜寻以 a 开头的行
ke$ 行尾,搜寻以 ke 结束的行
[root@longmax2002 zy]# cat -n test
     1  222
     2  3333
     3  444
     4  5655
     5  67777
[root@longmax2002 zy]# ^C
[root@longmax2002 zy]# more test | grep -n -i  5655
4:5655

如果想在当前路径即子路径(R或者r参数)查找包含某个字符串的文件:

[root@VM-0-17-centos grep]# grep 222 * -nR
1.sh:3:if [[ `grep -q "222" "2222234"`  ]];then
test:1:1  222

2.14 文本分析(awk)

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。

在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

假设ps -ef | grep nginx的输出如下:

[root@VM-0-17-centos grep]# ps -ef | grep nginx
nobody     965 16561  0 18:55 ?        00:00:00 nginx: worker process
root     10913  4865  0 21:38 pts/0    00:00:00 grep --color=auto nginx
root     16561     1  0  2020 ?        00:00:00 nginx: master process ./nginx

如果只显示进程id:

[root@VM-0-17-centos grep]# ps -ef | grep nginx | awk '{print $2}'
965
12848
16561

awk工作流程是这样的:

  • 读入有'\n'换行符分割的一条记录;
  • 然后将记录按指定的域分隔符划分域;
  • 填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是空格,所以$1表示登录用户,$2表示进程id,以此类推。

2.15 文本编辑(sed)

sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。

sed [-nefr] [动作]

选项与参数:

  • -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e :直接在命令列模式上进行 sed 的动作编辑;
  • -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
  • -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
  • -i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]function

  • n1, n2 :不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则"10,20[动作行为] ";

function:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(下一行为新行);
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
  • d :删除,因为是删除啊,所以 d 后面通常不接任何字符串;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(上一行为新行);
  • p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行;
  • s :取代,可以直接进行取代的工作,通常这个 s 的动作可以搭配正则表达式;

这是1.txt的内容:

[root@VM-0-17-centos grep]# cat 1.txt
d
ddd
#fff

修改1.text,将匹配到的第一个d替换成7523:

[root@VM-0-17-centos grep]# sed -i 's/d/7523/' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
7523
7523dd
#fff

修改1.text,将匹配到的所有d替换成7523:

[root@VM-0-17-centos grep]# sed -i 's/d/7523/g' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
7523
752375237523
#fff

去掉 “行首” 带“@”的首字母@:

sed -i 's/^@//' file

特定字符串的行前插入新行:

sed -i '/特定字符串/i 新行字符串' file

特定字符串的行后插入新行:

sed -i '/特定字符串/a 新行字符串' file
[root@VM-0-17-centos grep]# sed -i '/#fff/a xxxxxx' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
d
ddd
#fff
xxxxxx

特定字符串的删除:

sed -i '/字符串/d' file

删除第m到第n行:

sed -i 'm,nd file

三、进程、内存系统信息相关命令

3.1 查看系统

uname  -a   (Linux查看版本当前操作系统内核信息)

[root@longmax2002 yuncang]# uname -a
Linux longmax2002 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

cat /proc/version (Linux查看当前操作系统版本信息)

[root@longmax2002 yuncang]# cat /proc/version
Linux version 3.10.0-862.14.4.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed Sep 26 15:12:11 UTC 2018

cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息)

[root@longmax2002 yuncang]# cat /etc/issue
\S
Kernel \r on an \m

.getconf LONG_BIT  (Linux查看版本说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

 hostname (查看服务器名称)

[root@longmax2002 yuncang]# hostname
longmax2002

cat /proc/cpuinfo( 查看CPU信息 )

[root@longmax2002 yuncang]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
stepping        : 7
microcode       : 0x1
cpu MHz         : 2500.016
cache size      : 36608 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes

3.2 时间和日期(date、cal)

3.2.1 date

date命令:查看系统时间。

[root@longmax2002 zy]# date
Wed Sep 29 13:41:41 CST 2021
3.2.2 cal

cal命令:calendar 查看日历, -y 选项可以查看一年的日历

[root@longmax2002 zy]# cal
   September 2021
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

3.3 进程信息(ps、top、kill、pgrep)

所谓进程,通俗地说就是 当前正在执行的一个程序。

3.3.1 ps

Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。

ps [options] [--help]
选项含义
a 显示终端上的所有进程
u 显示进程的详细状态
x 显示没有控制终端的进程
-A 显示终端上的所有进程
-e 等于"-A"
e 显示环境变量
f
显示程序间的关系

ps aux:显示所有包含其他使用者的进程。

[root@longmax2002 yuncang]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  51736  2712 ?        Ss   May10   5:03 /usr/lib/syste
root         2  0.0  0.0      0     0 ?        S    May10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    May10   0:13 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   May10   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    May10   0:05 [migration/0]
root         8  0.0  0.0      0     0 ?        S    May10   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    May10  39:39 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S<   May10   0:00 [lru-add-drain
root        11  0.0  0.0      0     0 ?        S    May10   0:30 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    May10   0:20 [watchdog/1]
root        13  0.0  0.0      0     0 ?        S    May10   0:06 [migration/1]
root        14  0.0  0.0      0     0 ?        S    May10   0:20 [ksoftirqd/1]
root        16  0.0  0.0      0     0 ?        S<   May10   0:00 [kworker/1:0H]
root        18  0.0  0.0      0     0 ?        S    May10   0:00 [kdevtmpfs]
root        19  0.0  0.0      0     0 ?        S<   May10   0:00 [netns]
root        20  0.0  0.0      0     0 ?        S    May10   0:07 [khungtaskd]
root        21  0.0  0.0      0     0 ?        S<   May10   0:00 [writeback]
root        22  0.0  0.0      0     0 ?        S<   May10   0:00 [kintegrityd]
root        23  0.0  0.0      0     0 ?        S<   May10   0:00 [bioset]
root        24  0.0  0.0      0     0 ?        S<   May10   0:00 [bioset]
root        25  0.0  0.0      0     0 ?        S<   May10   0:00 [bioset]
root        26  0.0  0.0      0     0 ?        S<   May10   0:00 [kblockd]
root        27  0.0  0.0      0     0 ?        S<   May10   0:00 [md]
root        28  0.0  0.0      0     0 ?        S<   May10   0:00 [edac-poller]
root        35  0.0  0.0      0     0 ?        S    May10  58:07 [kswapd0]

查找指定进程:

ps -ef | grep 进程关键字

显示指定用户进程信息:

ps -u root

根据端口获取进程pid:

port=30999
#根据端口号查找对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
3.3.2 top

Linux top命令用于实时显示 process 的动态。

显示进程信息:

top - 14:26:38 up 141 days, 17:15,  1 user,  load average: 0.00, 0.10, 0.27
Tasks:  86 total,   1 running,  85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.3 sy,  0.0 ni, 99.3 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3880924 total,   682528 free,  1590964 used,  1607432 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2034188 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 3441 mysql     20   0 1951624 639476   5048 S   0.3 16.5 518:43.85 mysqld
 7515 root      10 -10  141776  18480   4532 S   0.3  0.5  65:36.51 AliYunDun
 9827 root      10 -10   41932   1920    420 S   0.3  0.0   7:15.38 AliYunDunUpdate
29249 root      20   0  145308   1500    248 S   0.3  0.0  82:52.92 redis-server
    1 root      20   0   51736   2712   1376 S   0.0  0.1   5:03.56 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.08 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:13.22 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S   0.0  0.0   0:05.41 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0  39:39.82 rcu_sched
   10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain
   11 root      rt   0       0      0      0 S   0.0  0.0   0:30.64 watchdog/0
   12 root      rt   0       0      0      0 S   0.0  0.0   0:20.67 watchdog/1
   13 root      rt   0       0      0      0 S   0.0  0.0   0:06.88 migration/1
   14 root      20   0       0      0      0 S   0.0  0.0   0:20.14 ksoftirqd/1

显示完整命令:

top -c
3.3.3 kill

kill [-9] 进程代号:终止指定代号的进程, -9 表示强行终止。

使用 kill 命令时,最好只终止由当前用户开启的进程,而不要终止 root 身份开启的进程,否则可能导致系统经常要查看进程的信息,包括进程的是否已经消亡。

3.3.4 pgrep

通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程

选项描述
-o 仅显示找到的最小(起始)进程号;
-n 仅显示找到的最大(结束)进程号;
-l 显示进程名称;
-P 指定父进程号;
-g 指定进程组;
-t 指定开启进程的终端;
-f 进程全名
-u 指定进程的有效用户ID。

查看指定名称的进程信息:

[root@VM-0-17-centos server]# pgrep ngsp-cmc
8564

-n 当匹配多个进程时,显示进程号最大的那个:

[root@VM-0-17-centos server]# pgrep -n ngsp-cmc
8564

3.4 磁盘信息(df、du)

3.4.1 df

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

df [选项]... [FILE]...
参数含义
-a 包含所有的具有 0 Blocks 的文件系统
--block-size={SIZE}  使用 {SIZE} 大小的 Blocks
 -i Inodes 列出 inode 资讯,不列出已使用 block
 -h  使用人类可读的格式

显示文件系统的磁盘使用情况统计:

[root@longmax2002 zy]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/vda1       61794300 53811240   4821056  92% /
devtmpfs         1929864        0   1929864   0% /dev
tmpfs            1940460        0   1940460   0% /dev/shm
tmpfs            1940460      676   1939784   1% /run
tmpfs            1940460        0   1940460   0% /sys/fs/cgroup
tmpfs             388096        0    388096   0% /run/user/0

第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。

使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。

用一个-i选项的df命令的输出显示inode信息而非块使用量。

Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/vda1      3932160 83009 3849151    3% /
devtmpfs        482466   332  482134    1% /dev
tmpfs           485115     2  485113    1% /dev/shm
tmpfs           485115   480  484635    1% /run
tmpfs           485115    16  485099    1% /sys/fs/cgroup
tmpfs           485115     1  485114    1% /run/user/0

-h选项,通过它可以产生可读的格式df命令的输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        59G   52G  4.6G  92% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  676K  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           379M     0  379M   0% /run/user/0
3.4.2 du

Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。du 会显示指定的目录或文件所占用的磁盘空间。

显示目录或者文件所占空间:

[root@bogon194 shell]# du
4       ./test
32      .

只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的32为当前目录的总大小

显示指定文件所占空间:

 du log2012.log 

方便阅读的格式显示test目录所占空间情况:

[root@bogon194 shell]# du -h
4.0K    ./test
32K     .

3.5 查看网卡信息

ifconfig:查看/配置计算机当前的网卡配置信息

[root@longmax2002 yuncang]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet xxx.xx.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:e7:7c:76:74  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet xxx.xx.xxx.47  netmask 255.255.240.0  broadcast xxx.xx.xxx.255
        ether 00:16:3e:08:09:35  txqueuelen 1000  (Ethernet)
        RX packets 32758819  bytes 10010046741 (9.3 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27094266  bytes 8748881502 (8.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 260063355  bytes 71415552425 (66.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 260063355  bytes 71415552425 (66.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

提示:一台计算机中有可能会有一个物理网卡和多个虚拟网卡,在 Linux 中物理网卡的名字通常以 ensX、ethx表示
127.0.0.1 被称为本地回环/环回地址,一般用来测试本机网卡是否正常。

ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅,数值越大,速度越慢。

# 检测到目标主机是否连接正常
$ ping IP地址
# 检测本地网卡工作正常
$ ping 127.0.0.1

3.6 netstat

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

常见参数:

  • -a (all)显示所有选项,默认不显示LISTEN相关;
  • -t (tcp)仅显示tcp相关选项;
  • -u (udp)仅显示udp相关选项;
  • -n 拒绝显示别名,能显示数字的全部转化成数字;
  • -l 仅列出有在 Listen (监听) 的服务状态;
  • -p 显示建立相关连接的程序名;
  • -r 显示路由信息,路由表;
  • -e 显示扩展信息,例如uid等;
  • -s 按各个协议进行统计;
  • -c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到.。

列出所有端口 (包括监听和未监听的):

[root@bogon194 ~]# netstat -a | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:afs3-fileserver 0.0.0.0:*               LISTEN
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN
tcp        0      0 bogon194:41320          10.64.200.219:29010     TIME_WAIT
tcp        0      0 bogon194:42544          10.64.200.219:29010     TIME_WAIT
tcp        0      0 bogon194:60106          10.64.200.219:29010     TIME_WAIT

 列出所有 tcp 端口 netstat -at:

[root@bogon194 ~]# netstat -at | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:afs3-fileserver 0.0.0.0:*               LISTEN
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN
tcp        0      0 bogon194:41320          10.64.200.219:29010     TIME_WAIT
tcp        0      0 bogon194:42544          10.64.200.219:29010     TIME_WAIT
tcp        0      0 bogon194:57808          10.64.200.219:29010     TIME_WAIT

列出所有 udp 端口 netstat -au:

[root@bogon194 ~]# netstat -au | more

列出所有监听 tcp 端口:

[root@bogon194 ~]# netstat -lt | more
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:afs3-fileserver 0.0.0.0:*               LISTEN
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN
tcp6       0      0 [::]:6379               [::]:*                  LISTEN
tcp6       0      0 [::]:6540               [::]:*                  LISTEN

四、用户权限相关命令

4.1 组管理

普通用戶创建组 / 删除组 的终端命令都需要通过 sudo 执行:

命令作用
groupadd 组名 添加组
groupdel 组名 删除组
cat /etc/group 确认组信息
chgrp -R 组名 文件/目录名 递归修改文件/目录的所属组

组信息保存在 /etc/group 文件中,/etc 目录是专门用来保存 系统配置信息 的目录。

4.2 用户管理

普通用户创建用户 / 删除用户 / 修改其他用户密码 的终端命令都需要通过 sudo 执行。

命令作用
useradd -m -g  组名 新建用户名

添加新用户

-m 自动建立用户home路径

-g 指定用户所在的组,否则会新建一个同名的组

passwd 用户名

设置用户密码

如果是普通用户,直接用passwd可以修改自己的账号密码

userdel -r 用户名

删除用户

-r 自动删除用户home路径

cat /etc/passwd | grep 用户名

确认用户信息

新建用户后,用户信息会保存在/etc/passwd文件中

4.3 查看用户信息

id [用户名]:查看用户 UID 和 GID 信息。

[root@longmax2002 yuncang]# id root
uid=0(root) gid=0(root) groups=0(root)

who:查看当前所有登录的用户列表;

[root@longmax2002 yuncang]# who
root     pts/1        2021-09-29 13:12 (xxx.xxx.xxxx.xx)

whoami:查看当前登录用户的账户名。

[root@longmax2002 yuncang]# whoami
root

4.4 which

which 命令可以查看执行命令所在位置,例如:

which ls
# 输出
# /bin/ls
which useradd
# 输出
# /usr/sbin/useradd

4.5 切换用户

su -用户名:切换用户,并且切换目录;

exit: 退出当前登录用户。

4.6 修改文件权限

chown:修改拥有者;

chgrp:修改组;

chmod:修改权限。

# 修改文件|目录的拥有者
chown 用户名 文件名|目录名
# 递归修改文件|目录的组
chgrp -R 组名 文件名|目录名
# 递归修改文件权限
chmod -R 755 文件名|目录名

五、远程管理相关命令

5.1 关机/重启

shutdown:关机/重新启动。

# 重新启动操作系统,其中 now 表示现在
$ shutdown -r now
# 立刻关机,其中 now 表示现在
$ shutdown now
# 系统在今天的 20:25 会关机
$ shutdown 20:25
# 系统再过十分钟后自动关机
$ shutdown +10
# 取消之前指定的关机计划
$ shutdown -c

5.2 ssh命令

在 Linux 中 SSH 是 非常常用 的工具,通过 SSH 客户端 我们可以连接到运行了SSH服务器 的远程机器上。

ssh的简单使用:

ssh [-p port] user@remote
  • user 是在远程机器上的用户名,如果不指定的话默认为当前用户;
  • remote 是远程机器的地址,可以是 IP/域名,或者是 后面会提到的别名;
  • port 是 SSH Server 监听的端口,如果不指定,就为默认值 22;

5.3 scp命令

scp 就是 secure copy ,是一个在 Linux 下用来进行 远程拷贝文件 的命令,需要注意的是,在指定端口时用的是大写的 -P 而不是小写的。

# 把本地当前目录下的 01.py 文件 复制到远程目录下的 Desktop/01.py
# 注意:`:` 后面的路径如果不是绝对路径,则以用户的Home目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py
# 把远程目录下的Desktop/01.py 文件 复制到本地当前目录下的 01.py
scp -P port user@remote:Desktop/01.py 01.py
# 加上 -r 选项可以传送文件夹
# 把当前目录下的demo文件夹 复制到远程目录Desktop
scp -r demo user@remote:Desktop
# 把远程目录Desktop下的文件复制到当前目录下的demo文件夹
scp -r user@remote:Desktop demo
选 项含义
-r 若给出的源文件是目录文件,则 scp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
-P 若远程 SSH 服务器的端口不是 22,需要使用大写字母 -P 选项指定端口

六、简单案例

6.1 通过端口停止一个spring boot web进程

#!/bin/bash
port=30999
#根据端口号查找对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');

#杀掉对应的进程(如果pid长度不为0)
if [  -n  "$pid"  ];  then
    echo $pid;
    kill  -9  $pid;
fi

首先利用netstat -nlp,列出所有监听端口,然后通过grep :\$port过滤满足的行数据。利用awk '{print \$7}'输出文本第7项:

最后利用awk -F,对字符串按照'/'拆分,并获取得到pid。

6.2 start/stop/restart服务脚本

#!/bin/bash

# 获取工作路径
WORKSPACE=`cd "$(dirname "$0")"/ || exist; pwd`  #等价$(...)
cd $WORKSPACE

# 创建临时目录
mkdir -p var

# 软件信息
app=app
pid_file=var/app.pid
log_file=var/app.log


# 从pid文件获取进程pid
function check_pid() {
    if [ -f $pid_file ];then
        pid=`cat $pid_file`
        if [[ -n $pid ]]; then           
            return `pgrep -f $app | grep -cv "PID TTY"`
        fi
    fi
    return 0
}


# 启动服务
function start() {
    check_pid
    # 获取进程pid
    pid=$?
    if [ $pid -gt 0 ];then
        echo -n "$app now is running already, pid="
        echo $pid_file
        return 1
    fi

   # 启动进程命令
    nohup ./$app web &> $log_file &
    sleep 1
    pid=`pgrep -f $app | grep -cv "PID TTY"`
    if [ $pid -gt 0 ];then
        echo $! > $pid_file
        echo "$app started..., pid=$!"
    else
        echo "$app failed to start."
        return 1
    fi
}


# 停止服务
function stop() {
    pgrep -f $app | xargs kill -9
    rm -f $pid_file
    echo "$app stopped..."
}


# 重启服务
function restart() {
    stop
    sleep 1
    start
}

# 获取进程状态
function status() {
    check_pid
    pid=$?
    if [ $pid -gt 0 ];then
        echo started
    else
        echo stoped
    fi
}

# 帮助
function help() {
    echo "$0 start|stop|restart|status"
}

if [ "$1" == "" ]; then
    help
elif [ "$1" == "stop" ];then
    stop
elif [ "$1" == "start" ];then
    start
elif [ "$1" == "restart" ];then
    restart
elif [ "$1" == "status" ];then
    status
else
    help
fi

6.3 nginx安装

#!/bin/bash
#installpath应用安装目录
installpath=/data

function printPercent()
{
    x=`expr $2 \* 100`
    p=`expr $x / $1`
    echo "percent:$p%"
    sleep 1
}


#判断是否有nginx在运行
pids=`ps -ef | grep nginx | grep -v grep | grep -v ${installpath}| awk '{print $2}'`


#正在运行 获取安装路径和配置文件路径
if [[ ${pids} ]];then
  echo  "nginx已经安装,并且正在运行"
  
  # 获取安装路径和配置文件路径
  for i in ${pids}; do
     echo $i
     # 获取nginx安装路径
     path=`ls -l  /proc/${i}/exe | awk '{print $11}'`
     if [[ -z $path ]];then
          echo   "无法获取nginx安装路径"
          exit 1
     else
          nginxPath=$path
          echo  "获取nginx可执行文件路径 $nginxPath"
          
          nginxConfig=`${nginxPath} -t  2>&1 | grep configuration`
          if [[ ! -z $nginxConfig ]];then
            nginxtmp="${nginxConfig%%test*}"
            nginxConfigPath="${nginxtmp##*file}"
            echo  "获取nginx配置文件  $nginxConfigPath"
          fi
     fi
     break
  done

  exit 1
fi


# ------------------------------------------- 安装nginx -------------------------------------------i
#成功完成步骤数
all=5
cd ${installpath}/components

echo  "-----------------------------------pcre开始安装-----------------------------------------"
tar -zxvf pcre-8.45.tar.gz
cd pcre-8.45
./configure --prefix=${installpath}/pcre
make
make install   # 分开 不分开可能异常
if [[ $? != 0 ]] ; then
    echo  "pcre安装失败"
    exit 1
else
    echo  "pcre安装成功"
fi
printPercent $all 1

cd ..
echo  "-----------------------------------openssl开始安装-----------------------------------------"
tar -zxvf openssl-fips-2.0.16.tar.gz
cd openssl-fips-2.0.16 
./config --prefix=${installpath}/openssl
make
make install
# 麒麟系统可能安装失败
if [[ $? != 0 ]] ; then
    echo  "openssl安装失败(可忽略)"
    # 麒麟3.3会安装失败 忽略失败。没有影响
else
    echo  "openssl安装成功"
fi
printPercent $all 2

cd ..
echo  "-----------------------------------zlib开始安装-----------------------------------------"
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=${installpath}/zlib
make
make install
if [[ $? != 0 ]] ; then
    echo  "zlib安装失败"
    exit 1
else
    echo  "zlib安装成功"
fi
    
printPercent $all 3
cd ..
echo  "-----------------------------------nginx开始安装-----------------------------------------"
tar -zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --prefix=${installpath}/nginx  --with-http_ssl_module
make
make install
if [[ $? != 0 ]] ; then
    echo  "nginx安装失败"
    exit 1
else
    echo  "nginx安装成功"
fi

printPercent $all 4


# 记录本次安装路径
echo "Record the installation info."
echo  "记录本次安装信息"

printPercent $all 5
exit 0

将当前install.sh脚本和components文件拷贝到/data路径下,components包下载路径如下:https://files.cnblogs.com/files/zyly/nginx-components.rar?t=1656983137。然后运行安装脚本即可安装nginx。

6.4 mysql安装

#!/bin/bash
# 参考 https://blog.csdn.net/atongmu2017/article/details/90610444
# mysql安装包路径
mysql_tar=/data/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz
install_path=/data
mysql_pwd=test123!@#


if [[ ! -f ${mysql_tar} ]];then
    echo 'mysql安装包不存在'
    exit 0
fi

if [[ -d ${install_path}/mysql ]];then
    echo 'mysql已经安装..................'
    exit 0
fi

#解压
echo '开始解压mysql安装包................'
tar -xvf ${mysql_tar} 
mv mysql-8.0.13-linux-glibc2.12-x86_64 mysql
mv mysql ${install_path}


# 创建用户和用户组
echo '开始创建用户和用户组..................'
cd ${install_path}
groupadd mysql
useradd -r -g mysql mysql
cd mysql
chown -R mysql:mysql ./
passwd mysql ${mysql_pwd}


#初始化数据库,并会自动生成随机密码,记下等下登陆要用 
echo '开始初始化数据库...................'
mkdir data
password=`bin/mysqld --initialize --user=mysql --basedir=./ --datadir=./data 2>&1 | grep 'root@localhost:' | awk '{print $13}' `
if [[ $? != 0 ]] ; then
    echo 'mysql安装失败'
else
    echo 密码是${password}
fi

#修改/usr/local/mysql当前目录得用户 
chown -R root:root ./
chown -R mysql:mysql data


#开始配置/etc/my.cnf
mysql_cnf=/etc/my.cnf
if [[ -f ${mysql_cnf} ]];then
   echo ${mysql_cnf}文件已经存在
   mv ${mysql_cnf} ${mysql_cnf}.bak
fi

echo 开始创建${mysql_cnf}......
touch ${mysql_cnf}
echo "[mysqld]" > ${mysql_cnf}
echo "basedir = ${install_path}/mysql" >> ${mysql_cnf}
echo "datadir = ${install_path}/mysql/data" >> ${mysql_cnf}
echo "socket = /tmp/mysql.sock" >> ${mysql_cnf}
echo "log-error = ${install_path}/mysql/data/error.log" >> ${mysql_cnf}
echo "pid-file = ${install_path}/mysql/data/mysql.pid" >> ${mysql_cnf}
echo "tmpdir = /tmp" >> ${mysql_cnf}
echo "port = 3306" >> ${mysql_cnf}
echo "max_allowed_packet=32M" >> ${mysql_cnf}
echo "default-authentication-plugin = mysql_native_password" >> ${mysql_cnf}
echo "log_bin_trust_function_creators = ON" >> ${mysql_cnf}
echo "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES" >> ${mysql_cnf}

#开始自启动
echo '设置mysql开机自启动........'
cd support-files
cp mysql.server /etc/init.d/mysql 
chmod +x /etc/init.d/mysql


if [[ -f ${install_path}/mysql/lib ]];then
   echo ${install_path}/mysql/lib文件已经存在
else
  echo "${install_path}/mysql/lib" >> /etc/ld.so.conf
fi


#配置环境变量
echo "export PATH="'$PATH'":${install_path}/mysql/bin:${install_path}/mysql/lib" >> /etc/profile
source /etc/profile



#启动服务
echo `service mysql start`


#连接数据库
mysql -u root -p ${password}
alter user 'root'@'localhost' identified by "${mysql_pwd}";

#开启navcat远程连接
use mysql;
select host, user, authentication_string, plugin from user;
update  user set host='%' where user='root';    
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY "${mysql_pwd}";
FLUSH PRIVILEGES;
exit;

将当前install.sh脚本和mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz文件拷贝到/data路径下,mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz包下载路径如下:云盘下载链接:https://pan.baidu.com/s/1CwH3yKNoQ_dUX4Q2xrA5Aw ,提取码:jxbk。然后运行安装脚本即可安装nginx。

参考文章

[1]史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

[2]30个关于Shell脚本的经典案例(上)

posted @ 2021-10-04 17:34  大奥特曼打小怪兽  阅读(1679)  评论(0编辑  收藏  举报
如果有任何技术小问题,欢迎大家交流沟通,共同进步