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
其他用户 othera
所有用户 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¶
- -r: 递归地压缩目录及其内容。如果要压缩整个目录,使用这个选项。
zip -r compressed.zip directory_name
- -u: 更新已有的压缩文件,仅添加新的文件或更新修改过的文件。
zip -u compressed.zip new_file.txt
- -d: 从压缩文件中删除指定的文件。
zip -d compressed.zip file_to_delete.txt
- -j: 只保存文件,不包含文件的目录结构。使用这个选项可以将所有文件放在压缩文件的根目录。
zip -j compressed.zip directory/*
- -q: 静默模式,不显示压缩过程中的输出信息。
zip -q compressed.zip file.txt
- -v: 显示压缩过程中的详细输出信息,包括每个文件的压缩情况。
zip -v compressed.zip file1.txt file2.txt
- -l: 显示压缩文件中包含的文件列表,但不进行实际压缩。
zip -l compressed.zip
- -x: 排除指定的文件或目录,不将其包含在压缩文件中。
zip -r compressed.zip source_dir -x "*.log"
- -T: 测试压缩文件的完整性。
zip -T compressed.zip
- -m: 压缩后删除源文件。适用于将文件移动到压缩文件后删除原文件。
zip -m compressed.zip file_to_move.txt
- -c: 创建压缩文件时,不包含目录信息。适用于创建一个只包含文件的压缩文件。
zip -c compressed.zip file.txt
- -P: 设置压缩文件的密码。
zip -P password compressed.zip file.txt
3.6 unzip¶
unzip
是用于解压缩文件的命令行工具,可以将压缩文件解压缩成原始的文件和目录。以下是一些常用的 unzip
命令选项说明:
- -d: 指定解压缩后的目标目录。
unzip compressed.zip -d target_directory
- -l: 列出压缩文件中包含的文件列表,但不进行实际解压缩。
unzip -l compressed.zip
- -q: 静默模式,不显示解压缩过程中的输出信息。
unzip -q compressed.zip
- -o: 覆盖已存在的文件,不询问用户。
unzip -o compressed.zip
- -n: 不要覆盖已存在的文件,跳过解压缩已存在的文件。
unzip -n compressed.zip
- -P: 提供解压缩文件的密码。
unzip -P password encrypted.zip
- -j: 只解压缩文件,不解压缩文件的目录结构。
unzip -j compressed.zip
- -v: 显示解压缩过程中的详细输出信息,包括每个文件的解压缩情况。
unzip -v compressed.zip
- -x: 排除指定的文件或目录,不进行解压缩。
unzip compressed.zip -x file_to_exclude.txt
- -t: 测试压缩文件的完整性,但不进行实际解压缩。
unzip -t compressed.zip
- -C: 将解压缩的文件名转换为小写。
unzip -C compressed.zip
- -j: 只解压缩文件,不解压缩目录。文件将解压缩到当前目录。
unzip -j compressed.zip
- -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 软链接¶
- 软链接,以路径的形式存在。类似于 Windows 操作系统中的快捷方式
- 软链接可以跨文件系统 ,硬链接不可以
- 软链接可以对一个不存在的文件名进行链接
- 原文件删除,软链接也将失效,此时对软链接进行写操作,原文件会再次出现,但此原文件索引节点已经改变,也就是说此原文件之前的硬链接将不再指向它
- 软链接可以对目录进行链接
- 软链接与原文件索引节点不同
3.14.2 硬链接:¶
- 硬链接,以文件副本的形式存在。但不占用实际空间。(理解 c 中指针,和原文件指向同一内存地址)
- 原文件丢失,不影响硬链接数据访问
- 不允许给目录创建硬链接(
-d
选项可强制给目录建立硬链接) - 硬链接只有在同一个文件系统中才能创建
- 硬链接与原文件索引节点相同
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
9.3 readlink¶
- 功能:查询文件符号链接
- 语法:
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] path
或basename 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
.