快捷键
回到命令行开头–Home
Ctrl+a
回到命令行的尾部–End
Ctrl+e
删除光标前边的所有字符
Ctrl+u
删除光标后边的所有字符
Ctrl+k
删除光标前的一个单词
Ctrl+w
输入曾经的命令下的某个单词或字母,按照单词的匹配history
Ctrl+r
cat
在cat
输出时候显示行数
cat -n maim.go
wc
统计文件行、单词、字符数量 格式:
usage: wc [-clmw] [file ...]
统计main.go
的行、单词、字符数量
wc main.go
选项:
-l 统计行数
-c 统计字符数
-w 统计单词数
-L 统计最长的行的字符数
nc
简单的文件传输工具
接收方
nc -l [port] > filename
发送方
nc [ip] [port] < filename
gzip
解压*.gz
的压缩文件
与*.tar.gz
文件不同,*.gz
文件需要用gzip
来解压
gzip -d filename
hostnamectl
修改hostname
,重启也生效
hostnamectl set-hostname CentOS
查看hostname
hostname
echo
-n
:不换行
-e
:支持扩展属性
# 红色显示OK
echo -e "\033[31mOK\033[0m"
# 绿色显示OK
echo -e "\033[32mOK\033[0m"
tr
删除多余重复字符串
# 删除多余的空格
echo "a b c" | tr -s " "
# 输出:a b c
# 删除多余的a
echo "aaaaacccdetaaadfa c" | tr -s "a"
# 输出:acccdetadfa c
cut
# 以冒号为分隔,过滤第一列
cut -d: -f1 /etc/passwd
# 输出当前系统下所有用户名
date
查看系统时间
date
# Tue Oct 12 13:36:24 CST 2021
tzselect
查看时区
ls -l /etc/localtime
# lrwxrwxrwx. 1 root root 33 Oct 12 11:32 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
获取TZ时区
tzselect
输出:
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#?
# 选择数字,依次选择地区、国家、城市,即可得到对应时区
# Asia/Shanghai
修改系统时区(所有用户生效)
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
xargs
xargs
是给命令传递参数的一个过滤器,可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据,一般是和管道一起使用。
格式:
somecommand | xargs [-item] [command]
选项:
-a file 从文件中读入作为 stdin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
top
Linux top
命令VIRT,RES,SHR,DATA的含义:
VIRT
:virtual memory usage
虚拟内存- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
- 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES
:resident memory usage
常驻内存- 进程当前使用的内存大小,但不包括swap out
- 包含其他进程的共享
- 如果申请100m的内存,实际使用10m,它只增长10m,与
VIRT
相反 - 关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR
:shared memory
共享内存- 除了自身进程的共享内存,也包括其他进程的共享内存
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:
RES – SHR
swap out
后,它将会降下来
top
运行中可以通过top
的内部命令对进程的显示方式进行控制。内部命令如下:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。
通过f
键可以选择显示的内容。按f
键之后会显示列的列表,按a-z
即可显示或隐藏对应的列,最后按回车键确定。
按o
键可以改变列的显示顺序。按小写的a-z
可以将相应的列向右移动,而大写的A-Z
可以将相应的列向左移动。最后按回车键确定。
按大写的F
或O
键,然后按a-z
可以将进程按照相应的列进行排序。而大写的R
键可以将当前的排序倒转。
命令
显示行号
:set number
在vi
中执行shell命令
:!ls-l
将shell
命令的结果插入到当前行的下一行
:r !date //读取系统时间并插入到当前行的下一行
将起始行号和结束行号指定的范围中的内容输入到shell命令command处理,并将处理结果替换起始行号和结束行号指定的范围中的内容
:62,72 !sort //将62行到72行的内容进行排序
当前光标所在行,除可以指定行号外,也可以用.
表示
:. !tr [a-z] [A-Z] //将当前行的小写转为大写
将起始行号和结束行号所指定的范围的内容作为命令command的输入,不会改变当前编辑的文件的内容
:62,72 w !sort //将62行到72行的内容进行排序,但排序的结果并不会直接输出到当前编辑的文件中,而是显示在vim敲命令的区域
将某一行作为shell
命令执行
:62 w !shell //将会把第62行的内容作为shell命令来执行并显示结果,而且不会改变当前编辑的文件的内容
脚本执行方式
- 需要可执行权限
- 相对路径执行
- 绝对路径执行
- 不需要可执行权限
sh 脚本文件名
source 脚本文件名
// 不会启动子进程,通过pstree
查看进程树
定义变量
- 定义变量:
变量名=变量值
- 取消变量:
unset 变量名
- 注意事项:
=
两边不能有空格- 不能使用关键字做变量名,如:
ls
、cd
等 - 如果变量名已存在,则会覆盖之前的变量值
- 变量名称由字母、数字、下划线组成,不能以数字开头
变量类型
- 环境变量:变量名通常大写,由操作系统维护
- 位置变量:shell内置变量,存储脚本执行时的参数
- 使用
$n
表示,n
为数字序列号:$1
、$2
、…、${10}
、${11}
、…
- 使用
- 预定义变量:shell内置变量,可以直接调用但是不能赋值或修改'
$0
:存储所在的进程或脚本名$$
:当前进程的PID
号$?
:命令执行后的返回状态,0-正常,其他-异常$#
:已加载的位置变量的个数$*
:所有位置变量的值
- 自定义变量:用户自主设置
多种引号的区别
- 双引号:允许扩展,以
$
引用其他变量 - 单引号:禁用扩展,将
$
视为普通字符 - 反引号:将命令执行的输出作为变量值,
$()
与反引号等效
变量的作用范围
- 局部变量:新定义的变量默认只在当前Shell中有效,无法在子Shell环境中使用
- 全局变量:在当前Shell以及子Shell中均有效(
export a=1
:定义全局变量a
)
read标准输入取值
read
从键盘读入变量值完成赋值
- 格式:
read [参数] [变量名]
- 参数:
-p
:提示信息-t
:指定超时秒数-s
:设置是否在终端显示输入的内容
变量作用范围
- 局部变量
- 新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用
- 全局变量
- 全局变量在当前Shell及子Shell中均有效,定义格式:
export a=1
- 全局变量在当前Shell及子Shell中均有效,定义格式:
数学运算
整数运算
使用$[]
或$(())
表达式
格式:$[整数1 运算符 整数2]
小数运算
Bash内建机制仅支持整数运算,不支持小数运算
可以通过计算器软件bc
实现小数计算
如果没有该软件需要使用yum
安装
bc
支持交互式和非交互式两种方式计算,scale=n
可以约束小数位
bc
也支持比较操作:
>,>=,<,<=,==,!=
表达式成立返回1
,否则返回0
字符串
字符串比较
中括号与字符串之间和运算符与字符串之间均有有个空格
是否为空:[ -z 字符串 ]
等于:[ 字符串1 == 字符串2 ]
不等于:[ 字符串1 != 字符串2 ]
整数值比较
[ 整数值1 操作符 整数值2 ]
-eq 等于(equal) -ne 不等于(not equal) -ge 大于等于(greater or equal) -le 小于等于(less or equal) -gt 大于(greater than) -lt 小于(less than)
文件状态测试
[ 操作符 文件或目录 ]
-e 判断对象是否存在(exit) -d 判断对象是否为目录(directory) -f 判断对象是否为一般文件(file) -r 判断对象是否有可读权限(read) -w 判断对象是否有可写权限(write) -x 判断对象是否有可执行权限(excute)
组合多个命令
;
:顺序执行
||
:前面执行失败继续执行
&&
:前面执行成功继续执行数组
存储多个数据的集合
test=(1 2 3)
echo ${test[0]}
函数
语法格式
function 函数名{
#命令序列
}
函数名(){
#命令序列
}
调用
函数名 参数1 参数2 ...
传递的值作为函数的位置参数
中断与退出
continue
:结束单次循环
break
:跳出循环体
exit
:退出脚本子串截取
${变量:起始位置:长度}
ab=123456
# 统计ab长度
echo ${#ab}
# 输出:6
echo ${ab:2:5}
# 输出:3456
内存
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
- VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
RSS / VSZ
- RSS是
Resident Set Size
(常驻内存大小)的缩写,用于表示进程使用了多少内存(RAM中的物理内存), RSS不包含已经被换出的内存。RSS包含了它所链接的动态库并且被加载到物理内存中的内存。RSS还包含栈内存和堆内存。 - VSZ是
Virtual Memory Size
(虚拟内存大小)的缩写。它包含了进程所能访问的所有内存,包含了被换出的内存, 被分配但是还没有被使用的内存,以及动态库中的内存。
假设进程A的二进制文件是500K,并且链接了一个2500K的动态库,堆和栈共使用了200K,其中100K在内存中(剩下的被换出或者不再被使用), 一共加载了动态库中的1000K内容以及二进制文件中的400K内容至内存中,那么:
RSS: 400K + 1000K + 100K = 1500K
VSZ: 500K + 2500K + 200K = 3200K
由于部分内存是共享的,被多个进程使用,所以如果将所有进程的RSS值加起来可能会大于系统的内存总量。
申请过的内存如果程序没有实际使用,则可能不显示在RSS里。比如说一个程序,预先申请了一大批内存, 过了一段时间才使用,你会发现RSS会增长而VSZ保持不变。
还有一个概念是PSS,它是proportional set size
(proportional是成比例的意思)的缩写。
这是一种新的度量方式。它将动态库所使用的内存按比例划分。比如我们前面例子中的动态库如果是被两个进程使用,那么:
PSS: 400K + (1000K/2) + 100K = 400K + 500K + 100K = 1000K
一个进程中的多个线程共享同样的地址空间。所以一个进程中的多个线程的RSS,VSZ,PSS是完全相同的。linux下可以使用ps或者top命令查看这些信息。