跳转至

Linix 命令

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

1 man

1.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]

1.2 man 指定类别

  • 语法:man [num] 文档名
$ man 1 flock
FLOCK(1)                                         User Commands                                        FLOCK(1)

NAME
       flock - manage locks from shell scripts

$ man 2 flock
FLOCK(2)                                   Linux Programmer's Manual                                  FLOCK(2)

NAME
       flock - apply or remove an advisory lock on an open file

2 基本操作

2.1 命令连接符 &&||;

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

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

2.2 命令前声明变量

在命令前声明变量将会把变量传递到子进程中,而不会影响当前进程。 - 示例

$ cat 1.sh
echo pid="$$",ENV1=${ENV1}
$ ENV1=hello echo pid=$$,ENV1=${ENV1} && ENV1=world  sh 1.sh && echo pid=$$,ENV1=${ENV1}
pid=2708532,ENV1=
pid=3350857,ENV1=world
pid=2708532,ENV1=
  • 分析:其中 echo 所在进程是 sh 命令的父进程,变量 ENV1 都是在进程号 2708532 中声明的,不会影响进程 2708532 ,但 sh 命令会启动子进程,所有 sh 脚本打印了 ENV1 变量。

2.3 文件重定向符

重定向到文件 `>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.4 echo

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

2.5 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.6 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.7 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 zip

  1. -r: 递归地压缩目录及其内容。如果要压缩整个目录,使用这个选项。
zip -r compressed.zip directory_name
  1. -u: 更新已有的压缩文件,仅添加新的文件或更新修改过的文件。
zip -u compressed.zip new_file.txt
  1. -d: 从压缩文件中删除指定的文件。
zip -d compressed.zip file_to_delete.txt
  1. -j: 只保存文件,不包含文件的目录结构。使用这个选项可以将所有文件放在压缩文件的根目录。
zip -j compressed.zip directory/*
  1. -q: 静默模式,不显示压缩过程中的输出信息。
zip -q compressed.zip file.txt
  1. -v: 显示压缩过程中的详细输出信息,包括每个文件的压缩情况。
zip -v compressed.zip file1.txt file2.txt
  1. -l: 显示压缩文件中包含的文件列表,但不进行实际压缩。
zip -l compressed.zip
  1. -x: 排除指定的文件或目录,不将其包含在压缩文件中。
zip -r compressed.zip source_dir -x "*.log"
  1. -T: 测试压缩文件的完整性。
zip -T compressed.zip
  1. -m: 压缩后删除源文件。适用于将文件移动到压缩文件后删除原文件。
zip -m compressed.zip file_to_move.txt
  1. -c: 创建压缩文件时,不包含目录信息。适用于创建一个只包含文件的压缩文件。
zip -c compressed.zip file.txt
  1. -P: 设置压缩文件的密码。
zip -P password compressed.zip file.txt

3.6 unzip

unzip 是用于解压缩文件的命令行工具,可以将压缩文件解压缩成原始的文件和目录。以下是一些常用的 unzip 命令选项说明:

  1. -d: 指定解压缩后的目标目录。
unzip compressed.zip -d target_directory
  1. -l: 列出压缩文件中包含的文件列表,但不进行实际解压缩。
unzip -l compressed.zip
  1. -q: 静默模式,不显示解压缩过程中的输出信息。
unzip -q compressed.zip
  1. -o: 覆盖已存在的文件,不询问用户。
unzip -o compressed.zip
  1. -n: 不要覆盖已存在的文件,跳过解压缩已存在的文件。
unzip -n compressed.zip
  1. -P: 提供解压缩文件的密码。
unzip -P password encrypted.zip
  1. -j: 只解压缩文件,不解压缩文件的目录结构。
unzip -j compressed.zip
  1. -v: 显示解压缩过程中的详细输出信息,包括每个文件的解压缩情况。
unzip -v compressed.zip
  1. -x: 排除指定的文件或目录,不进行解压缩。
unzip compressed.zip -x file_to_exclude.txt
  1. -t: 测试压缩文件的完整性,但不进行实际解压缩。
unzip -t compressed.zip
  1. -C: 将解压缩的文件名转换为小写。
unzip -C compressed.zip
  1. -j: 只解压缩文件,不解压缩目录。文件将解压缩到当前目录。
unzip -j compressed.zip
  1. -A: 自动处理文本文件的行终止符,可以用于跨平台的文本文件解压缩。
unzip -A textfiles.zip

3.7 rename

  • 语法形式:rename [options] expression replacement file...
  • 可选参数
  • -v:显示替换信息。
$ rename -v 2 1 *.log
`122.log' -> `112.log'

上面的命令是首先匹配 .log 后缀的文件,将里面的第 1 个匹配到的 2 替换成 1。

3.8 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.9 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.10 touch

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

3.11 rm

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

3.12 rmdir

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

3.13 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.14 ln

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

3.14.1 软链接

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

3.14.2 硬链接:

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

3.15 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.16 unalias

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

3.17 dos2unix

  • 功能:dos2unix 是将 Windows 格式文件转换为 Unix、Linux 格式的实用命令。Windows 格式文件的换行符为 \r\n (即 CRLF), 而 Unix&Linux 文件的换行符为 \n(即 LF). dos2unix 命令其实就是将文件中的 \r\n 转换为 \n
  • 安装:yum install dos2unix
  • 语法:dos2unix filename
  • 示例
find  ./ -name "*.sh"  | xargs -I {} dos2unix {}

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 行尾显示 $ 符号,也就是 \n 符号以 $ 符号显示
  • -v 显示不可打印符号(除了 TAB 和 LFD), 可以用来打印 \r 符号
  • -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 去除末尾空格

使用 tr 配合 cat。

cat 1.txt|tr -d '\0'

5.3 ls

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

5.4 lsof

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

5.5 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.6 pwd

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

5.7 id

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

5.8 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.9 who

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

5.10 compgen

  • 功能:

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.2.1 批量 kill 进程

其中 test_kill 是可以是进程名或其它匹配项

ps -ef|grep test_kill|awk '{print $2}'|xargs kill -9

8.3 pkill

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

8.4 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.5 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.6 hostid

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

8.7 getconf PAGE_SIZE

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

8.8 lsattr

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

8.9 chattr

  • 语法:chattr [option] [mode] [file]
  • option
    • -R:对子目录也生效
  • mode+-=[aAcCdDeijsStTu]
    • +-=+ 对应附加一个属性,- 对应减少一个属性,= 对应文件属性被替换
    • +i :它不能被删除或重命名,不能创建指向该文件的链接,文件不能以写入方式打开,但能追加写。
    • +a :设置文件上,文件只能以追加模式打开,通常用于日志文件追加写。
  • 功能:修改文件扩展属性

8.10 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

9 文件信息

9.1 file

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

9.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

10 远程操作

10.1 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

10.2 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

10.3 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地址:路径`

10.4 rz

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

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

10.5 sz

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

11 常用功能指令

11.1 sort

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

11.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

11.3 seq

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

11.4 truncate

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

11.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

11.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

11.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

11.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      

11.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
.

12 运维工具

12.1 fio IO 压力测试工具