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
其他用户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 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 软链接¶
- 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 软链接可以跨文件系统 ,硬链接不可以
- 软链接可以对一个不存在的文件名进行链接
- 原文件删除,软链接也将失效,此时对软链接进行写操作,原文件会再次出现,但此原文件索引节点已经改变,也就是说此原文件之前的硬链接将不再指向它
- 软链接可以对目录进行链接
- 软链接与原文件索引节点不同
3.11.2 硬链接:¶
- 硬链接,以文件副本的形式存在。但不占用实际空间。(理解c中指针,和原文件指向同一内存地址)
- 原文件丢失,不影响硬链接数据访问
- 不允许给目录创建硬链接(
-d
选项可强制给目录建立硬链接) - 硬链接只有在同一个文件系统中才能创建
- 硬链接与原文件索引节点相同
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
10.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
11 远程操作¶
11.1 ssh服务安装¶
- 安装ssh:
yum install -y openssh-server openssh-clients
- 修改配置:
vi /etc/ssh/sshd_config
- Port参数:ssh端口配置参数
- HostKey参数:加密类型,一般保留rsa类型,其它的注释
- ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
- 启动ssh
/usr/sbin/sshd -D &
- 互信
$ 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] 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
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
.