跳转至

Linix 命令

以下所有命令都只描述了常用的选项,忽略了很少涉及到的选项

1 man 手册数字含义

  • 【1】:Executable programs or shell commands
  • 【2】:System calls (functions provided by the kernel)
  • 【3】:Library calls (functions within program libraries)
  • 【4】:Special files (usually found in /dev)
  • 【5】:File formats and conventions eg /etc/passwd
  • 【6】:Games
  • 【7】:Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
  • 【8】:System administration commands (usually only for root)
  • 【9】:Kernel routines [Non standard]

2 基本操作

2.1 命令连接符&&||;

  • &&连接的多条命令会按顺序执行,直到命令出现错误就停止执行后面命令
  • ||连接的命令直到正确执行了一条命令就会终止后续命令的执行
  • ;连接的命令会按顺序一直执行,不管命令是否有误都不影响后续的命令执行
$ llk && echo "hello"
bash: llk:未找到命令
$ llk || echo "hello" || echo "world"
bash: llk:未找到命令
hello

$ llk ; echo "hello"
bash: llk:未找到命令
hello

2.2 文件重定向符

重定向到文件 `>file`。重定向到stdout、stderr需要 `>&1`或`>&2`,需要使用`&`用于区分是文件1还是标准输出

重定向符>,>><,<<;其中>>是以追加方式写入目标,而>是直接覆盖目标;<将源作为输入传给命令,而<<将多段以分隔符标识的范围数据传给命令 - 文件修饰符: - stdin标准输入流为0 - stdout标准输出流为1 - stderr标准错误流为2 - command 1>file1 2>file2表示将command执行结果的正确结果重定向到file1,错误结果重定向到file2(如果未指定文件标识符,默认为1,即标准输出流)

$ ls
test.sh
$ cat -n test.sh 
     1  #!/bin/bash
     2
     3  echo "hello world!"
     4  # 这是一条错误指令
     5  error
     6  date
$ bash test.sh 1>1.out 2>2.err
$ cat 1.out
hello world!
2021年 01月 14日 星期四 17:06:17 CST
$ cat 2.err
test.sh:行5: error:未找到命令
  • 3>&1用法
## 创建文件描述符3,并重定向到1
$ exec 3>&1
## 将文件描述符1重定向到3,即 1->3->1
$ echo >&3 "hello"
hello
## 创建文件描述符3,并重定向到/dev/null
$ exec 3>/dev/null
## 将文件描述符1重定向到3,即 1->3->/dev/null
$ echo >&3 "hello"
  • command 2>file 1>&2或者command >file 2>&1:其中1>&2表示标准输出流合并到标准错误流中,2>&1反之
$ ls
test.sh
$ bash test.sh 2>2.err 1>&2
$ cat 2.err
hello world!
test.sh:行5: error:未找到命令
2021年 01月 14日 星期四 17:26:58 CST
$ bash test.sh >1.out 2>&1
$ cat 1.out
hello world!
test.sh:行5: error:未找到命令
2021年 01月 14日 星期四 17:28:44 CST
  • command <<del data1 date2 del:表示将del分隔符范围的数据作为输入
shuhaiwen@shuhaiwen-PC:~/code/sh/test$ echo <<del
> 123
> 456
> end
> del

2.3 echo

  • 功能:输出一行文本
  • 语法:echo [option] 文本字符
  • -e:开启\转义符
  • -n:不输出末尾换行
  • 示例
$ echo -e "a\nb"
a
b
$ echo  "a\nb"
a\nb
$ echo -n a
$ echo a
a

2.4 pushd

pushd用的栈结构可以理解成环行栈,pushd +N或-N会改变栈顶和栈尾元素
  • 功能:bash自带命令,是一种cd的高级用法,进入目录的同时,将目录放入栈中,并可指定栈中路径进入
  • 语法:pushd [+N | -N | 目录]
    • pushd 目录:cd到目录,且将目录放入栈中
    • pushd +N:从栈顶跳向栈尾第N+1目录(N从0开始,+0就是本目录)
    • pushd -N:从栈尾跳向栈顶第N+1目录(N从0开始,-0就是栈顶目录)
  • 示例
[rocksdb@centos7 libgo]$ pushd ../gcc
~/gcc-12.1.0/gcc ~/gcc-12.1.0/libgo ~/gcc-12.1.0/zlib ~/gcc-12.1.0
[rocksdb@centos7 gcc]$ pushd +1
~/gcc-12.1.0/libgo ~/gcc-12.1.0/zlib ~/gcc-12.1.0 ~/gcc-12.1.0/gcc
[rocksdb@centos7 libgo]$ pushd -0
~/gcc-12.1.0/gcc ~/gcc-12.1.0/libgo ~/gcc-12.1.0/zlib ~/gcc-12.1.

2.5 popd

  • 功能:移除栈里面的元素,并进入目录
  • 语法:popd [+N | -N]
  • 示例
[rocksdb@centos7 zlib]$ dirs -v
 0  ~/gcc-12.1.0/zlib
 1  ~/gcc-12.1.0/libgo
 2  ~/gcc-12.1.0/libgcc
 3  ~/gcc-12.1.0
[rocksdb@centos7 zlib]$ popd +1
~/gcc-12.1.0/zlib ~/gcc-12.1.0/libgcc ~/gcc-12.1.0
[rocksdb@centos7 zlib]$ popd 
~/gcc-12.1.0/libgcc ~/gcc-12.1.0

2.6 dirs

  • 功能:显示或清理pushd、popd所用的栈元素
  • 语法:dirs [-clpv] [+N] [-N]
    • -l:显示栈元素(单行输出)(默认选项)
    • -p:显示栈元素(一个元素一行)
    • -v:显示栈元素,与-p相比行前有栈编号
    • -c:清除栈元素
  • 示例:
[rocksdb@centos7 libgo]$ pushd -0
~/gcc-12.1.0/gcc ~/gcc-12.1.0/libgo ~/gcc-12.1.0/zlib ~/gcc-12.1.0
[rocksdb@centos7 gcc]$ dirs -v
 0  ~/gcc-12.1.0/gcc
 1  ~/gcc-12.1.0/libgo
 2  ~/gcc-12.1.0/zlib
 3  ~/gcc-12.1.0

3 文件修改操作

3.1 chmod

  • chmod [ugoa][+-=][rwx][file]
  • u 用户user,表现文件或目录的所有者
  • g 用户组group,表现文件或目录所属的用户组
  • o 其他用户other
  • a 所有用户all
  • + 增加权限(附加)
  • - 移除权限
  • = 重赋值权限(覆盖之前的权限)
  • r 读权限
  • w 写权限
  • x 可执行权限
$ ls -l
总用量 0
-rw-r--r-- 1 xxx xxx 0 1月   3 13:30 1.md
$ chmod u=x 1.md
$ ls -l
总用量 0
---xr--r-- 1 xxx xxx 0 1月   3 13:30 1.md
总用量 0
$ chmod u+r 1.md
$ ls -l
总用量 0
-r-xr--r-- 1 xxx xxx 0 1月   3 13:30 1.md
  • chmod [01234567][file]
  • 0 无权限
  • 1 x权限
  • 2 w权限
  • 4 r权限
$ chmod 0544 1.md
$ ls -l
总用量 0
-r-xr--r-- 1 xxx xxx 0 1月   3 13:30 1.md

3.2 chgrp

  • 功能:改变文件所属组
  • 语法形式:chgrp [option] group file
  • -R:如果是目录,则会递归到子文件
~/code/cpp$ ls -l 1.file 
-rw-r--r-- 1 shuhaiwen shuhaiwen 38 1月  23 10:49 1.file
~/code/cpp$ sudo chgrp root 1.file 
~/code/cpp$ ls -l 1.file 
-rw-r--r-- 1 shuhaiwen root 38 1月  23 10:49 1.file

3.3 chown

  • 功能:改变文件拥有者或拥有组
  • 语法形式:chown [option] [OWNER][:[GROUP]] file
  • -R:如果是目录,则会递归到子文件

示例1:改变文件拥有者

~/code/cpp$ ls -l 1.file 
-rw-r--r-- 1 shuhaiwen root 38 1月  23 10:49 1.file
~/code/cpp$ sudo chown root 1.file 
~/code/cpp$ ls -l 1.file 
-rw-r--r-- 1 root root 38 1月  23 10:49 1.file

示例2:改变文件拥有者和所属组

~/code/cpp$ ls -l 1.txt 
-rw-r--r-- 1 shuhaiwen shuhaiwen 0 1月  28 11:06 1.txt
~/code/cpp$ sudo chown root:root 1.txt 
~/code/cpp$ ls -l 1.txt 
-rw-r--r-- 1 root root 0 1月  28 11:06 1.txt

3.4 tar

tar本质上只具有打包功能,而不具有解压缩功能,其内部调用gzip或其它打包工具才能执行解压缩功能

3.4.1 打包、解包

  • -c--create 建立新的备份文件
  • -f指定文件名
  • -v生成详细执行信息
  • -C dir:知道解压后存放的目录
  • --exclude=dir:排除知道目录或文件
$ tar -cvf 1.tar 1.md
1.md
$ ls
1.md 1.tar
$ ls
1.tar
$ tar -xvf 1.tar
1.md
$ ls
1.md  1.tar

3.4.2 解压包

  • -z:使用gzip压缩或解压(后缀gz)
  • -j:使用bzip2压缩或解压(后缀bz2)
  • -x:执行解压
$ tar -cvzf 1.tar.gz 1.md
1.md
$ ls
1.md  1.tar.gz
$ ls 
1.tar.gz
$ tar -xzvf 1.tar.gz
1.md
$ ls
1.md  1.tar.gz

3.4.3 查看压缩包内容

  • -t查看压缩包内容
$ tar -cvf 1.tar 1.md
1.md
$ tar -tf 1.tar
1.md

3.4.4 附加文件

  • -r--append 新增文件到已存在的备份文件的结尾部分
$ tar -cvf 1.tar 1.md
1.md
$ tar -tf 1.tar
1.md
$ tar -rvf 1.tar 2.md
2.md
$ tar -tvf 1.tar
-r-xr--r-- xxx/xxx 0 2021-01-03 13:30 1.md
-rw-r--r-- xxx/xxx 0 2021-01-03 14:16 2.md

3.5 mv

  • 语法形式:mv [option] [原文件] [目标文件]
  • 功能:
  • 文件或文件夹改名:mv oldname newname
  • 文件或文件夹移动
  • -b当目标文件存在时备份目标文件
  • -n当目标文件存在时不覆盖
  • -f当目标文件存在时覆盖,不提示(默认)
  • -i当目标文件存在时提示用户选择是否覆盖,y是,n否
  • -u当目标文件存在时,源文件比目标文件新时才覆盖
~/code/sh$ ls
1.txt  2.txt
~/code/sh$ mv -b 1.txt 2.txt
~/code/sh$ ls
1  2.txt  2.txt~

上例由于目标文件已存在,指定了-b选项后会生成备份文件2.txt~

~/code/sh$ ls
1.txt  2.txt
~/code/sh$ mv -n 1.txt 2.txt
~/code/sh$ ls
1.txt  2.txt

上例由于目标文件已存在,指定了-n选项后不会执行移动操作

~/code/sh$ ls
1.txt  2.txt
~/code/sh$ mv -f 1.txt 2.txt
~/code/sh$ ls
2.txt

上例由于目标文件已存在,指定了-f直接覆盖

~/code/sh$ mv -i 1.txt 2.txt
mv:是否覆盖'2.txt' n
~/code/sh$ ls
1.txt  2.txt

上例由于目标文件已存在,指定了-i生成了提示信息,选择n不覆盖

3.6 cp

cp命令参数和mv中很相似,可以参考 - 语法形式:cp [option] [原文件] [目标文件] - 功能:复制文件或目录 - -r:递归复制目录下所有文件,要复制目录必须指定 - -n当目标文件或目录存在时不覆盖 - -f当目标文件或目录存在时覆盖,不提示(默认) - -i当目标文件或目录存在时提示用户选择是否覆盖,y是,n否(cp实际同alias设置成cp -i,所有不想要提示时,需要使用/bin/cp) - -u当目标文件或目录存在时,源文件比目标文件新时才覆盖 - -b当目标文件或目录存在时备份目标文件 - 拷贝多个文件示例

# 拷贝多个文件到同一目录
cp file1 file2 dir
# 拷贝同一目录下文件到另一目录
cp dir1/{file1,file2} dir2

3.7 touch

touch实际上用用来修改文件时间属性的,但更多的用来新建文件。 - 语法形式:touch [option] [文件] - 功能: - 改变文件的时间属性 - 新建文件

3.8 rm

  • 语法形式:rm [option] [文件]
  • 功能:删除文件或目录
  • -f强制执行
  • -r -R --recursive递归删除目录及目录下文件
  • -i删除文件前提示
  • -v显示详细信息

3.9 rmdir

  • 语法形式:rm [option] [文件]
  • 功能:删除空目录,不能用来删除非空目录
  • -p --parents删除目录及其祖先,如rmdir -p a/b/c等价于rmdir a/b/c a/b a

3.10 mkdir

  • 语法形式:mkdir [option] [文件]
  • 功能:创建目录
  • -p如果目录存在则不创建,也不会报错;当父目录不存在时,创建父目录
  • -m指定目录权限
~/code/sh$ mkdir fd1
~/code/sh$ mkdir -m=777 fd2
~/code/sh$ ls -lF
drwxr-xr-x 2 xxx xxx 4096 1月  23 15:06 fd1/
drwxrwxrwx 2 xxx xxx 4096 1月  23 15:06 fd2/

3.11 ln

  • 语法形式:ln [option] [原文件] [链接文件]
  • 功能:为文件或目录创建链接
  • -b如果链接名存在,备份此文件再覆盖
  • -f如果链接名存在强制执行,不提示
  • -i如果链接名存在则显示提示信息
  • -P硬链接(默认)
  • -s符号链接

3.11.1 软链接

  1. 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  2. 软链接可以跨文件系统 ,硬链接不可以
  3. 软链接可以对一个不存在的文件名进行链接
  4. 原文件删除,软链接也将失效,此时对软链接进行写操作,原文件会再次出现,但此原文件索引节点已经改变,也就是说此原文件之前的硬链接将不再指向它
  5. 软链接可以对目录进行链接
  6. 软链接与原文件索引节点不同

3.11.2 硬链接:

  1. 硬链接,以文件副本的形式存在。但不占用实际空间。(理解c中指针,和原文件指向同一内存地址)
  2. 原文件丢失,不影响硬链接数据访问
  3. 不允许给目录创建硬链接(-d选项可强制给目录建立硬链接)
  4. 硬链接只有在同一个文件系统中才能创建
  5. 硬链接与原文件索引节点相同

3.12 alias

  • 功能:声明或显示别名
  • 语法:alias [-p] [name[=value] ...]
  • -p:打印别名列表,默认就有,可以不指定
  • [name[=value]:设置别名
  • 示例
$ alias user_ls='ls -l --color=auto'
$ alias
alias ll='ls -l --color=auto'
alias user_ls='ls -l --color=auto'
[here4@web17 fs6]$ 

3.13 unalias

  • 功能:移除别名
  • 语法:unalias [-a] [name ... ]
  • -a:移除所有别名
  • [name ... ]:仅移除指定别名
  • 示例
$ unalias user_ls

4 文件查找操作

4.1 find

  • 语法形式:find [path] -name [文件名] [option]
  • 功能:查找指定目录下文件
  • -name fileName:指定查找文件名如find /opt -name 1.txt,在/opt目录下查找1.txt文件
  • -iname fileName:同-name但忽略大小写
  • -type fileType:指定文件类型
  • -size [+][-]fileSize:指定文件大小,+大于,-小于
  • -exec command {} \;:查到文件后对文件执行命令,如find /opt -name 1.txt -exec rm -f {} \;,查找1.txt并删除
  • -ok command {} \;
  • 示例
# 在.dir目录下查找 以file1或file2开头的文件
find ./dir -name "file[1,2]*"

4.2 whereis

  • 语法形式:whereis [option] [文件名]
  • 功能:查找二进制文件、源码文件、man手册文件位置,查找路径在$PATH and $MANPATH环境变量
~/code/cpp$ whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
~/code/cpp$ whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc

4.3 which

  • 语法形式:which [option] [文件名]
  • 功能:查找可执行文件位置,查找路径在$PATH环境变量
~/code/cpp$ which rm
/usr/bin/rm

4.4 whatis

  • 语法形式:whatis [option] [命令名]
  • 功能:查询一个命令执行什么功能
fzbk@fzbk:~$ whatis rm
rm (1)               - remove files or directories

5 显示信息操作

5.1 cat

  • 语法形式:cat [option] [文件]
  • 功能:打印文件内容到控制台
  • -n-b输出行号,-b会忽略空行
  • -T将tab以^I符号表示
  • -E行尾显示$符号
  • -A等价于-vET
$ cat -n 1.txt 
     1  hello
     2
     3  world
$ cat -b 1.txt 
     1  hello

     2  world
$ cat -A 1.file
C$
C.UTF-8$
en_US.utf8$
POSIX$
zh_CN.utf8$

5.2 ls

  • 语法形式:ls [option]
  • 功能:列出目录内容
  • -a --all列出所有文件或目录,包括...
  • -A列出所有文件或目录,不包括...
  • -l以一行列表格式显示(显示信息多)
  • -1按行显示文件
  • -m按列列出文件,文件间用,分割
  • -i --inode显示文件的索引节点号
  • -R --recursive子目录文件也会显示出来
  • -s --size显示文件大小
  • -F在文件或目录结尾添加指示符(one of */=>@|)
  • 排序选项
    • -S按文件大小排序,大->小
    • -t按修改时间排序,新->旧
    • -X按扩展名字母排序

5.3 lsof

  • 语法形式:lsof [option] file
  • 功能:列出打开文件的进程,不带参数默认显示所有打开该文件的进程信息

5.4 locale

  • 语法形式:locale [option]
  • 功能:给出区域特定的信息
  • -a显示可用locale信息
  • locale显示当前locale信息
~/code/sh$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
~/code/sh$ locale -a
C
C.UTF-8
en_US.utf8
POSIX
zh_CN.utf8

5.5 pwd

  • 语法形式:pwd [option] ...
  • -L:不管是不是符号链接,都打印此目录(默认)
  • -P:打印实际目录,如果是符号链接,将打印链接目录的路径
  • 功能:显示当前路径信息
~/code/sh$ pwd
/home/shuhaiwen/code/sh

5.6 id

  • 语法形式:id [option] username
  • -u:打印uid
  • -g:打印gid
  • -G:打印附属组id
  • -n:打印名字而不是id
  • 功能:查看用户相关信息
~$ id shuhaiwen
uid=1016(shuhaiwen) gid=1016(shuhaiwen) groups=1016(shuhaiwen)

5.7 date

  • 语法形式:date [+FORMAT]
  • %s:时间戳
  • %Y:年,如2021
  • %m:月,范围[00..12]
  • %d:天,范围[00..31]
  • %H:小时,如[00..23]
  • %M:分钟,范围[00..59]
  • %S:秒,范围[00..59]
  • 示例
$ date +%s
1639651517
date "+%Y:%m:%d %H:%M:%S"
2021:12:16 18:45:44

5.8 who

  • 功能:显示登录信息
  • 语法:who [option]
  • 不带参数,显示当前登录的用户
  • -b:上一次系统启动的时间

6 库相关

6.1 ldconfig

  • 功能:设置运行时期动态链接,通常在向/lib和/usr/lib添加了新动态库后用来更新动态库
  • sudo ldconfig:刷新动态链接库缓存文件 /etc/ld.so.cache
  • -p:打印缓存中保持的.so文件名,缓存数据来自文件/etc/ld.so.cache
$ ldconfig -p|grep bz2
        libbz2.so.1 (libc6,x86-64) => /lib64/libbz2.so.1
        libbz2.so (libc6,x86-64) => /lib64/libbz2.so
$ sudo ldconfig

6.2 ldd

ldd不是一个可执行程序而是一个shell脚本。
  • 功能:打印动态库的依赖关系
shuhaiwen@shuhaiwen:~/code/cpp$ ldd liblocale.so
linux-vdso.so.1 (0x00007ffd5e582000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8ffeb07000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8ffe984000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8ffe96a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ffe7a9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8ffecb5000)

7 用户、组增删改

用户组/用户名长度不大于32字节

7.1 /etc/passwd 查看所有用户名

所有用户名记录下 /etc/passwd 文件。

[root@localhost ~]# 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

7.2 /etc/group 查看所有用户组名

title: 为什么用户属于某个用户组,但在`/etc/group`中显示空?
这是因为在useradd创建用户时初始组不会记录到`/etc/group`中,如果userdd时指定-G(-g是初始化组)或者通过`usermod -a user -G group`命令添加的才会显示。

所有用户组名记录下 /etc/group 文件。

[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

/etc/group 中每一行表示一个用户组,每一行记录分成 4 部分,用 : 分隔,含义如下: 1. 用户组名 2. 用户组密码(加密显示 x) 3. 用户组gid 4. 用户列表 其中用户列表可能存在多个用户,用 , 分个,如下,gtest 用户组含有 2 个用户 shw、utest1:

[root@localhost ~]# cat /etc/group|grep gtest
gtest:x:1001:shw,utest1

7.3 useradd

  • 功能:增加用户
  • 语法:useradd [option] 用户名
  • -u uid :指定用户的uid
  • -m:创建用户时,会在home目录下生成用户目录
  • -g groupname :指定初始化组(不会显示在/etc/group 第 4 部分用户列表中)
  • -G groupname :将用户添加到附加组中(附加组/etc/group 第 4 部分用户列表将会显示此用户)
  • -s, --shell SHELL :指定新用户登录 shell 的名称
  • 示例
root@小锋哥:$ useradd -m user2
root@小锋哥:$ ls /home
user2

7.4 passwd

  • 功能:修改用户密码
  • 语法:passwd [用户]
  • 示例
# root用户可以指定user
$ passwd user01
# 普通用户不能指定用户,默认修改此用户
$ passwd

7.5 userdel

  • 功能:删除用户
  • 语法:userdel [option] 用户名
  • -r:删除用户时,会把home目录下用户目录删除
  • -f :当用户还在登录状态,依然强制删除
  • 示例
root@小锋哥:$ userdel -r user2
root@小锋哥:$ ls /home

7.6 usermod

  • 功能:修改用户账号,包括添加到新用户组中。
  • 语法:usermod [options]
    • -u uid :修改用户 uid,如``
    • -a :(必须要和-G 选项一起使用)添加用户到附加组中
    • -G, --groups GROUP1[,GROUP2,...[,GROUPN]]] :指定用户组,有 2 中表现:
      • 当和-a 一起使用时,是将用户添加到用户组中(类似追加操作)
      • 当单独使用时,设置用户属于指定的组;如果之前用户属于某个组,但这个组不在选项的组列表中,那么就会将用户从这个用户组中删除。
  • 示例:修改用户 shw 的 uid 到1010
[root@localhost ~]# id shw
uid=1000(shw) gid=1000(shw) groups=1000(shw),1001(gtest),1002(gtest1)
[root@localhost ~]# usermod shw -u 1010
[root@localhost ~]# id shw
uid=1010(shw) gid=1000(shw) groups=1000(shw),1001(gtest),1002(gtest1)
  • 示例:用户 shw 添加到用户组 gtest 中
[root@localhost ~]# usermod -a shw -G gtest
[root@localhost ~]# cat /etc/group|grep gtest
gtest:x:1001:shw
  • 示例:原先用户 shw 属于用户组 gtest、gtest1,执行后只属于 gtest1
[root@localhost ~]# cat /etc/group|grep gtest
gtest:x:1001:shw
gtest1:x:1002:shw
[root@localhost ~]# usermod shw -G gtest1
[root@localhost ~]# cat /etc/group|grep gtest
gtest:x:1001:
gtest1:x:1002:shw

7.7 groups

  • 功能:显示用于属于哪些用户组。
  • 示例
[root@localhost ~]# groups shw
shw : shw gtest gtest1

7.8 groupadd

  • 功能:添加用户组
  • 语法:groupadd [options] 组名
  • -g gid:添加组时,指定组号(需唯一,默认组号在最大组号上+1)
  • -U username :创建用户组时设置用户属于这个组,多个用户用 , 分隔
  • 示例
[root@localhost ~]# groupadd gtest2 -U shw,utest1
[root@localhost ~]# cat /etc/group|grep gtest2
gtest2:x:1012:shw,utest1

7.9 groupdel

  • 功能:删除组
  • 语法:groupdel [options] 组名
  • 示例
root@小锋哥:$ groupdel g1200

8 系统相关

8.1 ps

  • 功能:查看系统进程信息
  • 语法形式:ps [option]
  • e:显示所有进程
  • -A:显示所有进程
  • -f:显示完整格式列表
  • -L:显示进程线程
  • -H:以层级显示(显示父进程)
  • 示例
#显示系统所有进程信息
ps -ef
ps -aux
# 显示线程信息
ps -aL

8.2 kill

  • 功能:停止指定进程
  • 语法形式:kill PID
#停止进程
kill 1201
#显示信号
kill -l

8.3 pkill

  • 功能:通过进程名kill进程。(类似ps和kill的结合体)
  • 语法:pkill [option] 进程名
  • -u:用户名
  • -signal:指定信号,如,-9-15-HUP
  • 示例
$ pkill -u here4 -9 test_pkill

8.4 netstat

  • 功能:打印网络、路由的信息
  • 语法:netstat [option]
  • -a:显示listening和non-listening 套接字
  • -l:仅显示listening套接字
  • -n:显示数字地址,而不是尝试确定符号主机,端口或用户
  • -p:显示进程id和进程名
  • 示例
# 常用命令
$ netstat -anp
# 查找端口是否被占用
$ netstat -anp | grep 端口号

8.5 ss

  • 功能:统计网络信息工具,同netstat

8.6 uname

  • 功能:查询系统信息
  • 语法形式:uname [option]
  • -a:打印系统所有信息
  • -s:打印内核名(默认)
  • -m:打印架构名
  • -o:打印操作系统名
  • -n:打印网络节点主机名
  • 示例
$ uname 
Linux
$ uname -s
Linux
$ uname -m
x86_64
$ uname -o
GNU/Linux
$ uname -a
Linux web17 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ uname -n
web17

8.7 hostname

  • 功能:is used to display the system's DNS name, and to display or set its hostname or NIS domain name.
# 显示主机名
hostname
# 修改主机名
hostname newname
# 显示ip
hostname -i
# 显示所有ip
hostname -I
# 显示dns域名
hostname -d

8.8 hostid

  • 功能:打印host id
$ hostid
007f0101

8.9 getconf PAGE_SIZE

  • 功能:获取系统页大小
  • 示例
# 也大小4KB
$ getconf PAGE_SIZE
4096

8.10 lsattr

  • 语法:lsattr [option] [file]
  • -R:会将子目录内的文件也列出
  • 功能:查看文件扩展属性
  • 示例
$ lsattr 1.file
-------------e-- ./1.file

8.11 chattr

  • 语法:chattr [option] [mode] [file]
  • option
    • -R:对子目录也生效
  • mode+-=[aAcCdDeijsStTu]
    • +-=+对应附加一个属性,-对应减少一个属性,=对应文件属性被替换
  • 功能:查看文件扩展属性

8.12 ulimit

永久修改可以设置/etc/security/limits.conf文件
  • 功能:查询或修改系统限制资源信息(临时修改)
  • 语法:ulimit [option]
  • -a:打印所有系统限制资源信息
  • -c [value]:core文件大小;当不指定value时,打印信息;当指定了value时,修改资源信息
  • -f [value]:写文件大小
  • ...
  • 示例
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 50521
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 50521
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
$ ulimit -c 1024
$ ulimit -c
1024

8.13 top

8.13.1 基本按键操作

  • P:以占据CPU百分比排序
  • M:以占据内存百分比排序
  • T:以累积占用CPU时间排序
  • q:退出命令:按q键退出top查看页面
  • s:修改刷新时间间隔。按下s键,然后按下数字,即可修改刷新时间间隔为你输入的数字,单位为秒。例如:按下s键,在按数字1键,即可实现每秒刷新一次
  • u:设置只显示的指定用户下进程信息。按下u键,再输入用户名
  • f:设置增加显示的内容。按f键进入:1.上下移到光标,按空格开启或关闭此条目;2.左右键选中条目,在上下移动动指定位置,可以对显示栏排序

8.14 参数说明

  • VIRT :Virtual Memory 虚拟内存,是内存的虚拟地址,此部分中部分已经映射到了物理内存,有些还没有。
  • RES :Resident Memory 长驻内存,虚拟内存空间中已经映射到物理内存空间的那部分。
  • SHR :share Memory 共享内存,指与其它进程共享动态库的那部分内存。

8.15 free

  • 功能:显示空闲和已使用的内存
  • 语法:free [options] -b: 以Byte为单位显示内存使用情况; -k: 以KB为单位显示内存使用情况; -m: 以MB为单位显示内存使用情况; -g: 以GB为单位显示内存使用情况。 -o: 不显示缓冲区调节列; -s [n]: 多少秒刷新一次 -t: 显示内存总和列;
  • 示例
$ free -b
              total        used        free      shared  buff/cache   available
Mem:    67300700160  7164715008  1799909376  6971514880 58336075776 52455710720
Swap:             0           0           0
$ free -k
              total        used        free      shared  buff/cache   available
Mem:       65723340     6995492     1759024     6808120    56968824    51227580
Swap:             0           0           0
$ free -m
              total        used        free      shared  buff/cache   available
Mem:          64182        6831        1717        6648       55633       50026
Swap:             0           0           0
$ free -g
              total        used        free      shared  buff/cache   available
Mem:             62           6           1           6          54          48
Swap:             0           0           0
$ free -t
              total        used        free      shared  buff/cache   available
Mem:       65723340     6994256     1760256     6808120    56968828    51228824
Swap:             0           0           0
Total:     65723340     6994256     1760256
  • 输出信息解释
total   #表示系统的总内存
used    #表示使用的内存
free    #表示空间的内存
shared  #表示共享链接库使用的内存
buff/cache  #表示系统的page cache和buffer使用到的内存
available   #表示应用程序还可以申请到的内存

其中有如下关系 $$ 公式一:total=used+free+buff/cache $$ $$ 公式二:shared \subseteq used $$ $$ 公式三:available \le free+buff/cache $$

8.16 df

  • 语法:df [OPTION]... [FILE]...
  • -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
  • -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
  • -H :以 M=1000K 取代 M=1024K 的进位方式;
  • -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
  • -i :不用硬盘容量,而以 inode 的数量来显示
  • 功能:(全称disk full)列出文件系统的整体磁盘空间使用量
  • 示例1:查看系统所有文件系统(不包括特殊的文件系统)
$ df -h
文件系统        容量  已用  可用 已用% 挂载点
udev            1.9G     0  1.9G    0% /dev
tmpfs           391M  2.8M  388M    1% /run
/dev/sda5        15G  6.7G  7.4G   48% /
tmpfs           2.0G  7.2M  1.9G    1% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/sda3        11G  6.8G  3.5G   66% /recovery
/dev/sda1       1.5G  287M  1.1G   21% /boot
/dev/sda7        16G  2.2G   13G   15% /data
tmpfs           391M   32K  391M    1% /run/user/1000
  • 示例2:查看指定目录或文件
df -h /home/shw
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda7        16G  2.2G   13G   15% /home

8.17 du

  • 语法:du [OPTION]... [FILE]...
  • -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
  • -h :以人们较易读的容量格式 (G/M) 显示;
  • -c :打印出总用量信息
  • -d[depth] :显示深度为depth的子目录信息
  • -s :列出总量而已,而不列出每个各别的目录占用容量;
  • -S :不包括子目录下的总计,与 -s 有点差别。
  • 功能:(全称disk used)检查磁盘空间使用量
  • 示例1: 默认递归打印当前目录下所有目录磁盘使用量
$ ls
a.out  class.cpp  network  sed.script  test_lambda.cc  test_lambda.i
$ du
4       ./network
672     .
  • 示例2:文件也单独打印出
du -a
4       ./test_lambda.cc
4       ./sed.script
4       ./class.cpp
4       ./network
20      ./a.out
632     ./test_lambda.i
672     .
  • 示例3:-s、-S、-c比较
$ du
4       ./network
672     .
$ du -s
672     .
$ du -S
4       ./network
668     .
$ du -c
4       ./network
672     .
672     总用量

9 系统性能分析工具

9.1 uptime

  • 功能:显示系统已经运行多长事件
  • 语法:uptime [options]
    • -s:显示系统从什么时候启动(格式 yyyy-mm-dd HH:MM:SS)
    • -p :以更好的格式显示
  • 示例
[root@centos7 ~]# uptime -s
2022-08-09 18:02:48
[root@centos7 ~]# uptime -p
up 13 minutes
[root@centos7 ~]# uptime
 18:16:06 up 13 min,  1 user,  load average: 0.00, 0.03, 0.04

9.2 dmseg

  • 功能:打印或控制内核环形缓冲区(ring buffer)

9.3 vmstat

  • 功能:打印虚拟内存统计信息

9.4 mpstat

  • 安装:yum install -y sysstat

9.4.1 iostat

  • 安装:yum install -y sysstat

9.5 pidstat

  • 安装:yum install -y sysstat

9.6 sar

10 文件信息

10.1 file

  • 语法形式:file [option] [文件名]
  • 功能:打印文件信息
~/code/cpp$ file 1.file
1.file: ASCII text
~/code/cpp$ file locale.cpp
locale.cpp: C++ source, ASCII text

10.2 stat

  • 语法形式:stat [OPTION]... FILE...
  • -f:显示文件系统状态信息(默认显示此文件状态信息)
  • 功能:打印文件状态信信或文件系统状态信息
  • 示例1:显示文件信息,部分结果解释
  • Size:文件实际大小
  • Blocks:文件占用块数量(一般磁盘一个block512)
  • IO Block:每一个块的大小(文件系统一个块是4096,相当于磁盘块大小*8)
  • Links:硬链接数
$ stat docker_id.txt
  File: docker_id.txt
  Size: 64              Blocks: 8          IO Block: 4096   regular file
Device: 810h/2064d      Inode: 54253       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     shw)   Gid: ( 1000/     shw)
Access: 2021-10-20 18:53:25.215949300 +0800
Modify: 2021-10-20 18:53:13.225949300 +0800
Change: 2021-10-20 18:53:13.225949300 +0800
 Birth: -
  • 示例2:显示文件系统信息,部分解释如下
  • File:文件名。
  • ID:十六进制文件系统ID。
  • Namelen:文件名称最大的长度。
  • Fundamental block size:文件系统上每个块大小。
  • Blocks:
    • Total:文件系统中的总块数。
    • Free:文件系统中可用的块数。
    • Available - 非root用户可用的可用块数。
  • Inodes:
    • Total:文件系统中的总索引节点数。
    • Free:文件系统中空闲索引节点的数量。
$ stat -f docker_id.txt
  File: "docker_id.txt"
    ID: fedc9aa3bd65bc57 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 65793553   Free: 64015674   Available: 60656135
Inodes: Total: 16777216   Free: 16722700
  • 功能:查询文件符号链接
    • 语法:readlink [option] file
      • 空选项:查询文件的链接路径
      • -f:查询最终符号链接路径
$ readlink /usr/bin/java
/etc/alternatives/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b03-1.el7.aarch64/jre/bin/java

11 远程操作

11.1 ssh服务安装

  1. 安装ssh:yum install -y openssh-server openssh-clients
  2. 修改配置:vi /etc/ssh/sshd_config
    1. Port参数:ssh端口配置参数
    2. HostKey参数:加密类型,一般保留rsa类型,其它的注释
  3. ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
  4. 启动ssh/usr/sbin/sshd -D &
  5. 互信
$ cd ~/.ssh
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
$ cp id_rsa.pub authorized_keys

11.2 ssh

  • 功能:用于远程登录,在远程主机上执行命令
  • 语法:ssh [option] [user@]hostname [command]
  • -l login_name:指定登录用户名,等价user@hostname中的user
  • -p port:指定ssh端口号,默认22
  • 示例
# 在远程主机192.168.32.32上的用户shw上执行ls ~命令
ssh shw@192.168.32.32 ls ~
# 用-l指定登录的用户名,以用户shw登录远程主机192.168.32.32
ssh 192.168.32.32 -l shw

11.3 ssh-keygen

  • 语法:ssh-keygen [option]
  • 功能:用于为ssh生成、管理和转换认证密钥,它支持RSA和DSA两种认证密钥
  • -t [rsa|dsa]:指定密钥类型rsa(默认)或dsa
  • -f file:指定生成密钥的文件名
  • -b number:指定密钥长度(最小1024bit)
  • 示例
ssh-keygen -t dsa -f key.file -b 1024

11.4 scp

  • 语法:scp [option] 源文件 目标路径
  • 源文件路径:[user1@]host1:]dir1/[file1]([]表示可有可无)
  • 目标路径:[user2@]host2:]dir2/[file2]
  • 功能:主机之间复制文件和目录(类似cp)
  • -r:递归复制整个目录
  • -p:保留原文件的修改时间,访问时间和访问权限
  • -P port:指定ssh端口号,默认ssh端口号是22,如果环境中ssh端口号不是22,通过-P来指定一个端口号
  • 示例:从本地复制到本地
# 本地复制本地,并且修改复制的文件
scp ~/test.txt ~/test/test.txt.bak
  • 示例:从本地复制到远程
#将本地用户目录下的test.txt文件复制到远程主机10.10.10.10上用户为user1的目录下
scp ~/test.txt user1@192.168.10.10:/home/user1/dir
  • 示例:从远程复制到本地
scp user1@192.168.10.10:/home/urer1/test.txt /home/user1/dir
  • 示例:从远程复制到远程
scp user1@192.168.10.10:/home/urer1/test.txt user1@192.168.10.11:/home/user1/dir
远程语法 `用户名@IP地址:路径`

11.5 rz

XShell、SecureCRT 或 PuTTY 工具支持rz、sz功能。

- rz 命令 (Receive ZMODEM),使用 ZMODEM 协议,将本地文件批量上传到远程 Linux/Unix 服务器,注意不能上传文件夹。   - 使用方法:输入 rz,再按回车,会弹出文件选择框,选择文件上传。

11.6 sz

  • sz 命令是利用 ZModem 协议来从 Linux 服务器传送文件到本地,一次可以传送一个或多个文件。
  • 使用方法:sz + 文件名,再按回车,会弹出文件选择框,选择下载目录。

12 常用功能指令

12.1 sort

  • 功能:排序文本内容
  • 语法:sort [option] file
    • -r:降序排序
    • -f:忽略大小写排序 (小写转大写排序)
  • 示例
$ sort sort.file
Ab
ab
$ sort -f sort.file
Ab
ab
$ sort -r sort.file
ab
Ab

12.2 uniq

  • 功能:去除连续重复行,统计非重复行
  • 语法:uniq [option] file
    • -c:去除重复行,在行首打印重复行的行数
    • -i:比较时,不考虑大小写
    • -d:只打印重复行(单行)
    • -D:只打印重复行(每一行都打印)
  • 示例
$ cat uniq.file
www.baidu.com
www.gitee.com
www.google.com
www.google.com
www.gitee.com
www.gitee.com
www.github.com
www.gitee.com
www.google.com
$ uniq uniq.file
www.baidu.com
www.gitee.com
www.google.com
www.gitee.com
www.github.com
www.gitee.com
www.google.com
$ uniq -dc uniq.file
      2 www.google.com
      2 www.gitee.com
$ uniq -D uniq.file
www.google.com
www.google.com
www.gitee.com
www.gitee.com
$ sort uniq.file |uniq -c
      1 www.baidu.com
      4 www.gitee.com
      1 www.github.com
      3 www.google.com

12.3 seq

  • 功能:指定首位数字和步长,输出数值
  • 语法:seq [option] [first] [step] last
  • -f 分隔符:指定输出结果间的分割符(默认\n)
  • 示例:
# 指定首数字1,尾数字10,步长2,输出结果被\n分割
$ seq 1 2 10
1
3
5
7
9

12.4 truncate

  • 功能:将文件的大小缩小或扩展到指定的大小
  • 语法:truncate [option] file
  • -s size:指定缩小或扩大文件的大小
  • 示例
# 将file1文件大小变成1M
truncate -s 1M file1

12.5 dd

  • 功能:用于复制文件并对原文件的内容进行转换和格式化处理
  • 语法
  • if=输入文件:指定输入文件
  • of=输出文件:指定输出文件
  • bs=n[c,w,b,k,M,G]:指定块大小(c=1byte,w=2byte,b=512byte,kB =1000, K =1024, MB =10001000, M =10241024, xM =M GB =100010001000, G =102410241024, and so on for T, P, E, Z, Y.)
  • count=n:指定被复制块数量
  • 示例
# 输入文件/dev/zero 输出文件outfile 
dd if=/dev/zero of=outfile bs=1k count=1

12.6 shuf

  • 功能:生成随机数
  • 语法:
  • -i LO-HI:指定随机数生成的区间,如1-10,生成大于等于1小于等于10的数
  • -n number:生成几行数据
  • -r:表示生成的数据可以重复(默认不可以重复),当生成数可用总数小于需要生成数的数量时,需要打开,否则生成不了被-n指定的数据量
  • 示例
# 输出数10,输出范围 1-3 ,数据可重复
$ shuf -n 10 -i 1-3 -r
2
3
2
1
1
1
3
3
3
1
# 输出数10,输出范围 1-3,数据不可重复(仅输出3个,因为数据不可重复)
$ shuf -n 10 -i 1-3
1
3
2

12.7 xargs

  • 功能:从命令行标准输出中获取参数传递给命令执行(xargs一般与管道结合使用)
  • 语法:
  • -I 替换字符:指定替换字符,默认是{}或()
  • -d 分割符:指定xargs分解输入字符,默认是换行
  • -n number:指定每行多少项
  • -L number:指定一次读多少行
  • 示例
# 将find查询结果用{}替换,ls -l {}列出查找文件属性
shw@shw-PC:~$ find code -name sed*|xargs -I {} ls -l {}
-rw-r--r-- 1 shw shw 25 7月  10 17:00 code/sed.script
shw@shw-PC:~$ find code -name sed*|xargs -I {} cp {} {}.tmp
shw@shw-PC:~$ ls code
sed.script  sed.script.tmp
# 以a作为分隔符,使用xargs默认的echo输出
shw@shw-PC:~$ echo -n "1a2a3"|xargs -da
1 2 3
# -n 指定每行多少项作为一个参数
shw@shw-PC:~$ echo -n "1a2a3a4"|xargs -da -n2
1 2
3 4
# -L指定一次读取多少行作为一个参数
shw@shw-PC:~$ echo -e "1\n2\n3\n4"|xargs -L2
1 2
3 4

12.8 basename

  • 功能:计算给定路径的文件名
  • 语法:basename [-a|-s suffix] pathbasename path [suffix]
    • -a:可以有多个路径
    • -s suffix:去除后缀
  • 示例
shw@shw-PC:~$ basename /usr/bin/sort
sort
shw@shw-PC:~$ basename include/stdio.h .h
stdio
shw@shw-PC:~$ basename -s .h include/stdio.h
stdio
shw@shw-PC:~$ basename -a any/str1 any/str2
str1
str2      

12.9 dirname

1. 当路径上没有/时,显示.
  • 功能:去除给定路径的文件名部分
  • 语法:dirname [OPTION] NAME...
  • 示例
shw@shw-PC:~$ dirname /usr/bin/
/usr
shw@shw-PC:~$ dirname dir1/str dir2/str
dir1
dir2
shw@shw-PC:~$ dirname stdio.h
.

13 运维工具

13.1 fio IO压力测试工具