当做个人字典使用, 会进行不定期更新!

tar

打包与压缩命令。

常用参数:

  • -c (–create) 建立新的备份文件
  • -x (–extract) 从备份文件中还原文件
  • -z (–gzip或–ungzip) 通过gzip指令处理备份文件
  • -v (–verbose) 输出执行过程中的详细信息
  • -f (–file) 指定备份文件
1
2
3
4
5
# 将/home文件夹下所有内容打包压缩成home.tar.gz文件
tar -czvf home.tar.gz /home

# 将home.tar.gz文件解压到当前目录
tar -xzvf home.tar.gz

getops

该命令可以用来解析命令行参数。

以下表示获取命令行参数 -d -t的值

1
2
3
4
5
6
7
8
9
10
11
while getopts 'd:t:' OPT; do
case $OPT in
d)
echo "d $OPTARG"
exit 0;;
t)
echo "t $OPTARG";;
?)
echo "no match"
esac
done

其中getopt和getopt的区别以及getopt的详细用法示例见:https://blog.sigoden.com/how-to-use-getopt-to-build-cli/

awk

工作流程: 读入有\n换行符分割的一条记录,然后将该记录按指定的域分隔符划分域(默认的域分隔符是空格符)

语法

awk 参数 ‘BEGIN{ commands } pattern { commands} END{commands}’

参数: -F 指定字段定界符,默认是空格,可以是正则表达式, 注意分隔符直接跟在后面, 不需要任何符号

pattern: 模式,可以是正则表达式,用来匹配每一行,使用//包裹, 如 /^tcp/表示匹配每一行开头以tcp开始

BEGIN内指定参数:

  • FS 同-F; FS=”” 表示以空行切分记录

特殊参数:

  • $0 所有域, $1 第一个域, $2 第二个域,以此类推
  • $NF 表示一行中的最后一个字段

流程控制语法:

if(condition){} else if(condition){} else{}

循环语法:

for (i=0; i<3;i++){}

指定分隔符

有三种方法,下面分别是指定分隔符为逗号时的写法:

  1. 使用 -F 指定,注意其后不需要任何符号, 语法:awk -F, file
  2. 使用FS指定,加上-v参数, 语法: awk -v FS="," file
  3. 在BEGIN内部指定, 语法: awk 'BEGIN {FS=","}' file

字符串函数

  • length(string) 获取字符串长度(字符数)

  • 拼接字符串时不需要使用任何修饰符,直接即可

  • printf() 格式化输出,默认不输出换行符.
    %s 字符; %d 整数,小数取整直接去除尾数; %.2f 小数,2表示小数点保留两位,最后一位四舍五入
    printf(“%.2f\n”, 1.3374) 输出1.34

  • split(string,array [,r]) 字符串拆分,返回拆分后数组大小string:待拆分的字符串,array:拆分后结果保存的数组,r:分隔符,可选,默认FS值;拆分后的数组下标从1开始,
    for(k in arr){print arr[k]}

  • substr(s,i [,n]) 字符串截取
    s:待截取字符串;i:索引位置,从1开始;n:要截取的长度.默认截取到字符尾。

  • 字符串查找:index(s,t), match(s,r [,a])
    返回第一次匹配成功的索引位置,从1开始,失败返回0
    s: 待查找的字符串;t:目标子串
    r: 查询的正则表达式, a 结果二维数组

  • 字符串替换

    • sub(r,s[,t]) 替换首次匹配到的子串,返回成功替换子串的数目,r 用于匹配的正则表达式,s 要替换的字符串值,t 目标字符串n,默认$0
    • gsub(r,s[,t]) 用法同sub,替换所有匹配到的子串
    • gensub(r,s,h[,t]) h: “g”表示全局替换,或是用数字指定子串出现的位置

时间函数

  • systime() 返回精确到秒的当前时间戳
  • mktime(date) 获取指定时间的时间戳,date格式: “YYYY MM DD HH MM SS”
  • strftime() 转化时间字符串

注意

  • 中间命令的编写一定要用单引号包裹,不能用双引号

  • 当字符串中含有单引号,转义写法如下:

    1
    2
    # 此为打印单引号,比较字符串的单引号同理
    awk '{print "'\''"}'
  • awk中比较在一个范围之内不能用连写方式,如 2<x<7是错误的,应写成 x>2 && x<7

  • awk 使用外部变量,需要在Action之后定义变量,如下所示使用外部test变量:

    1
    2
    test=hhhhfudfhdhf
    awk '{print test}' test="$test" filename

示例

1
2
# 假设一个目录下的文件按照时间进行命名, 如202204011628.tar.gz,现在要取出每个文件名的前8位(也就是年月日), 操作如下
ls|awk 'BEGIN {FS="."} {a=substr($1,1,8);print a}'

grep

在命令之前加上LANG=C之后可大幅提高检索速度, 如 LANG=C grep -ia -B 1 Exception filename

参数说明:

  • -i 忽略大小写
  • -a 显示文本(当使用通配符搜索文件内容时,有时只显示匹配的文件名而不显示匹配的内容,用此参数即可)
  • -e 指定多个匹配样式
  • -c 计算找到的符合行的次数
  • -n 输出匹配行的行号
  • -v 反转查找
  • -w 只显示全字符合的列
  • -A n 打印匹配行和匹配行之后的n行
  • -B n 打印匹配行和匹配行之前的n行
  • -C n 打印匹配行和匹配行之前,之后的n行,共2n+1
  • -h 在显示匹配行的那一列之前,不显示该列的文件名称
  • -o 只输出文件中匹配到的部分

示例:

1
2
3
# 过滤时间段内的数据, 例如[15:10:00,15:20:00)
# 需要注意,正则表达式中的数字范围只能是一位整数
grep "15:1[0-9]" file

zgrep

可以搜索gz压缩文件内的内容。用法同grep

sed

语法

sed options script file

默认不对原文件进行修改,处理的是原文件的拷贝

options参数:

  • -n 取消默认的输出,仅显示处理后的结果
  • -e 以选项中指定的script处理
  • -i 直接修改原文件,慎用

script 参数:

  • d 删除
  • p 打印
  • s 替换

注意

  • 若在sed命令中使用外部的变量,此时匹配规则必须使用双引号

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 打印第三行
sed -n '3p' file

# 打印第200行到300行
sed -n '200,300p' file

# 删除文件中的所有空白行
sed -n '/^$/d' file

# 在每个有Statement行的下一行添加一个空行
sed '/Statemt/G'

# 将文件中含有test字符串的行打印出来
sed -n '/test/p' test.txt

# 将文件中my字符替换为Bob
sed 's/my/Bob/g' test.txt

# 将文件中第三行替换为huang
sed -i '3s/.*/huang/' file

echo

-n 省略结尾的换行符,直接在文本后面输入

read

read value 读取用户输入

df

显示磁盘信息

  • -a 所有
  • -h 可读性较好显示

tail & head

从文件开头或文件结尾查看文件

1
2
3
4
5
6
7
8
9
10
11
#  显示文件最后n行
tail -n file

# 实时查看文件内容, 一般查看实时查看日志文件用此命令
tail -f file

# 显示文件的前n行
head -n file

#显示文件的m到n行
head -n file | tail -m

zip

压缩文件

  • -q 不显示指令执行过程
  • -r 递归处理

示例

1
2
#将 /home/db2/ddl目录下所有文件和文件夹压缩至当前目录的test.zip文件
zip -q -r test.zip /home/db2/ddl

typeset

设置变量

ps

显示系统进程信息(linux中线程是伪线程,用轻量级进程来实现的,所以查看线程信息也是用此命令)

参数

  • -ef 显示系统运行的所有进程信息

返回信息

  • PID :该进程的进程ID号
  • %CPU:该进程使用掉的 CPU 资源百分比
  • %MEM:该进程所占用的物理内存百分比
  • VSZ :该进程使用掉的虚拟内存量 (单位KB)
  • RSS :该进程占用的固定的内存量 (单位KB)
  • TTY :该进程表示在哪个终端机上面运作,其取值可能有如下几种
    • ? 与终端机无关
    • tty1-tty6 本机上面的登入者程序
    • pts/0 由网络连接进主机的程序
  • STAT:该程序目前的状态,主要的状态有
    • R :该程序目前正在运作,或者是可被运作
    • S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒
    • T :该程序目前正在侦测或者是停止了
    • Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
  • START:该进程被触发启动的时间
  • TIME :该进程实际使用 CPU 运作的时间

crontab

定时任务

参数

  • -l 查看现有cron表中的内容
  • -e 编辑

cron文件的语法如下:

1
f1 f2 f3 f4 f5 program
  • 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
  • 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
  • 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
  • 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
  • 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推

示例

1
2
3
4
5
# 每一分钟执行一次
* * * * * program

# 每天7:50执行一次
50 7 * * * program

创建定时任务步骤

crontab -e

其他常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 当有service命令
#启动
service crond start
# 停止
service crond stop
# 重启
service crond restart

# 当没有service命令
/etc/init.d/cron stop
/etc/init.d/cron start
/etc/init.d/cron restart

tee

将命令运行结果同时输出到终端和文件

ls |tee log.log

du

显示文件或目录大小

  • -c 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和
  • -h 按友好模式显示
  • -s 只显示目录总大小
  • -l 重复计算硬件连接的文件
  • –max-depth 超过指定层数的目录后,予以忽略
1
2
3
4
5
6
# 查看当前目录总大小
du -sh
# 查看当前目录下一级子文件和子目录占用的磁盘容量
du -lh --max-depth=1
# 统计当前文件夹(目录)大小,并按文件大小排序
du -sh * | sort -n

scp

Linux服务器之间传输文件

1
2
3
4
5
# 传输aa.txt文件到206服务器的home目录下
scp aa.txt usroot@22.5.229.206:/home/

# 206服务器下载aa.txt文件到本服务器当前路径:
scp usroot@22.5.229.206:/home/aa.txt .

sort

排序. 排序时以行为单位

  • -r 下降排序,默认升序
  • -n 按照数值大小排序
  • -k 指定排序所依据的列数,从1开始
  • -t 指定排序时的列分隔符
  • -u 输出行中去除重复行

示例:

1
2
# 按照文件大小从大到小进行排序
ls -l|sort -nr -k 5

uniq

忽略文件中的重复行,常与sort一起使用

  • -c 在每列旁边显示该行重复出现的次数
  • -d 仅显示重复出现的行
  • -u 仅显示唯一出现的行

注意: uniq的去重是将当前行与上一行进行对比, 所以为了得到整体去重, 需要先进行排序,在执行去重

top

实时显示系统进程情况.

20210104190258

以下命令为进入该命令之后执行:

  • M 根据内存大小进行排序
  • P 根据CPU使用百分比进行排序
  • T 根据时间/累计时间排序

输出参数说明:

  • 第一行相当于uptime命令输出
    • 第一列时间表示当前系统时间
    • 第二列 up 6 days 58min, 表示系统已经运行时间
    • 第三列 2 users, 表示表示当前有2个用户在登陆
    • 第四列 load average三个值分别表示系统1分钟,5分钟,15分钟平均负载
  • 第二行 tasks信息表示系统运行的整体进程数量和状态信息
    • zombie 僵尸进程数.
  • 第三行 %Cpu(s)表示的是总体CPU使用情况
    • us user 表示用户态的CPU时间比例. 当us很高时,证明CPU时间主要消耗在用户代码,需要优化用户代码
    • sy system 表示内核态的CPU时间比例. 说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)
    • wa iowait 表示处于IO等待的CPU时间比例. 很高时,说明有进程在进程频繁的IO操作,有可能是磁盘IO,也有可能是网络IO
    • ni nice 表示运行低优先级进程的CPU时间比例
    • id idle 表示空闲CPU时间比例
    • hi hard interrupt 表示处理硬中断的CPU时间比例
    • si soft interrupt 表示处理软中断的CPU时间比例
    • st steal 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例
  • 第4行. 内存使用情况, 单位KiB
    • totol 表示总内存
    • free 表示没使用过的内容
    • used是已经使用的内存
    • buff表示用于读写磁盘缓存的内存
    • cache表示用于读写文件缓存的内存
    • avail表示可用的应用内存
  • 第5行, swap使用情况, 单位KiB, Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用. 这三个值都为0表示系统关闭了swap功能,虚拟机一般都关闭swap功能
    • Swap total表示能用的swap总量
    • swap free表示剩余
    • used表示已经使用的
  • 之后为各个进程具体的信息.各字段说明如下
    • PID 进程ID
    • USER 进程所有者的用户名,例如root
    • VIRT 虚拟内存, virtual memory usage。单位KB. 表示当前进程能够访问到的最大内存大小
    • RES 物理内存(不包括共享内存), resident memory usage,单位KB。表示当前有多少物理内存被这个进程消费。如果申请 100m 的内存,实际使用 10m,那么RES = 10m,VIRT=100M。 一般情况下看此值大小即可
    • SHR 进程使用的共享内存. 单位KB
    • CPU 进程使用的CPU占比
    • MEM 进程使用的内存占比
    • TIME 进程启动后到现在所用的全部CPU时间
    • COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)

ls

ls -l 的输出内容格式如下:

-rw-r--r-- 1 root root 25934 Jun 26 10:35 X120

参数:

  • -h 友好方式显示大小
  • -a 所有
  • -l 详细格式列表
  • -t 用文件和目录的更改时间排序
  • -r 反向排序

添加-l参数时详细输出参数说明:

  • 第一列
    • 第一个, 文件类型
      • d 目录
      • -文件,
      • c 字符型文件
      • b 块设备
      • l 链接文件
    • 接下来三个为一组,用来表示权限信息,其中 r 读, w 写, x 执行. 具体如下:
      • 2,3,4:文件所有者权限
      • 5,6,7:同用户组的权限
      • 8,9,10:非本用户组的权限
  • 第二列:有多少文件名连接到此节点
  • 第三列:所有者账号
  • 第四列:文件所属的用户组
  • 第五列:文件大小,默认B
  • 第六列:最近修改日期

示例:

1
2
# 仅显示目录名
ls -d */

stat

查看文件属性,包括文件创建时间

  • Access 访问时间,每读一次这个文件内容,就会更新。比如对这个文件使用more命令。ls、stat命令都不会修改文件的访问时间
  • Modify 修改时间,对文件内容进行写操作,就会更新。比如:vi后保存文件。ls -l列出的时间就是这个时间。
  • Change 状态改变时间,通过chmod命令更改一次文件属性,这个时间就会更新。

split

分割大文件为多个小文件

参数:

  • -b value 按value大小分割文件,即分割后每个文件大小为value(单位为byte)
  • -l value 按行数分割文件,即分割后每个文件行数为value
  • -d 使用数字作为文件名后缀

curl

不带任何参数, 默认发送get请求

参数:

  • -d 发送post请求的数据体

    1
    curl -d 'login=emma&password=123' -X POST https://google.com/login
  • -H 设置请求头

    1
    curl -H 'Content-Type: application/json' https://google.com/login
  • -o 将服务器回应保存成文件, 等同于wget

  • -s 不输出错误和进度信息

  • -X 指定请求的方法

    1
    curl -X POST https://www.example.com

xargs

语法: xargs [-options] [command]

作用是将标准输入转为命令行参数

管道符|将左侧的标准输出转化为标准输入, 供右边命令使用, 但是这需要右边命令支持标准输入作为参数, 如grep是支持的, 下面命令是可以的.

1
ps -ef|grep java

但是很多命令不支持标准输入作为参数, 如echo, 下面这条命令没有任何输出

1
echo "sdsd"|echo

下面这条命令输出 sdsd

1
echo "sdsd"|xargs echo

参数:

  • -d 指定分隔符,默认将换行符和空格作为分隔符,如制表符为”\t”

示例:

1
2
# 保留当前目录下所有txt格式的文件, 删除所有其他类型的文件
ls|grep -v ".txt"|xargs rm

lsof

查看某个端口占用情况.一般查看端口冲突时可使用该软件.

lsof -i:port

nohup

后台执行命令,即使退出此终端, 仍然会执行。

示例:

1
2
3
4
5
6
7
# nohup输出的信息不输出到文件
nohup ./program >/dev/null 2>&1 &

# nohup命令执行的log日志输出到指定文件
# 2>&1表示不仅命令行正常的输出保存到backupdb.log中,产生错误信息的输出也保存到backupdb.log中
# &表示该进程在后台运行
nohup ./backupdb.sh >backupdb.log 2>&1 &

htop

相比于top显示的信息更加详细

注意几点:

  • htop默认会把一个进程里的线程当做一个进程来显示出来,若要关闭线程,只显示进程,按F2,再选择 Display options,再选择 Hide userland threads

nload

查看各个网络设备的当前网络速率,也会展示流经设备的总流量 。

也可指定网卡, 如查看网卡eth0的流量 nload etho

注意:页面上显示的速率单位MBit/s, 是M比特每秒, 换算成正常的MB/s(M字节每秒)需要除以8

date

1
2
3
4
5
6
7
8
9
# 格式化成 2020-01-12 23:23:34
date "+%Y-%m-%d %H:%M:%S"

date -d "+1 day" +%Y%m%d #显示后一天的日期
date -d "-1 day" +%Y%m%d #显示前一天的日期
date -d "-1 month" +%Y%m%d #显示上一月的日期
date -d "+1 month" +%Y%m%d #显示下一月的日期
date -d "-1 year" +%Y%m%d #显示前一年的日期
date -d "+1 year" +%Y%m%d #显示下一年的日期

查看系统发型版本

1
cat /etc/*release*

iostat

用于查看系统设备的IO负载情况, 同时也会显示出CPU处理器的使用情况。

数据来源是 /proc/diskstats

https://cloud.tencent.com/developer/article/1698369

语法:iostat [参数] 设备名

常用参数:

  • -d 显示设备利用率
  • -c 显示CPU使用情况
  • -h 使用NFS网络文件系统来输出报告
  • -N 显示LVM逻辑卷管理器设备信息
  • -p 显示块设备和分区的状态
  • -t 显示报告产生时的时间
  • -x 显示更为详细的信息, 一般情况下都需要带上这个参数,方便分析
  • -k 以 KB 为单位显示
  • -m 以 M 为单位显示

输出关键参数说明:

avg-cpu行表示总体cpu的使用情况, 对于多核,这里指的是平均值:

  • %user CPU在用户态执行进程的时间百分比
  • %nice CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比
  • %system CPU处在内核态执行进程的时间百分比
  • %iowait CPU用于等待I/O操作占用CPU总时间的百分比, 若该值过高,表示硬盘可能存在I/O瓶颈
  • %idle CPU空闲时间百分比, 若该值高但系统响应慢,可能是cpu等待分配内存,此时应该加大内存;若该值持续低于1,则系统的cpu处理能力相对较低,应该加大cpu

Device行表示磁盘设备的情况:

  • tps 每秒IO数, 表示 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和
  • kB_read/s 每秒从磁盘读取数据大小,单位KB/s
  • kB_wrtn/s 每秒写入磁盘的数据的大小,单位KB/s
  • kB_read 从磁盘读出的数据总数,单位KB
  • kB_wrtn 写入磁盘的的数据总数,单位KB
  • r/s 每秒读操作的次数
  • rkB/s 同kB_read/s
  • %util 代表磁盘繁忙程度。越大越繁忙。一般地,如果该参数是100%表示设备已经接近满负荷运行(如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)
  • await 平均每次IO请求的等待时间(包括等待时间和处理时间,单位为毫秒), 这里可以理解为响应时间,一般的系统应该低于5ms,若超过10ms则比较大。一般情况下await与svctm差值(真正的等待时间)越大,队列的时间越长,系统可能存在问题
  • svctm 平均每次IO请求的处理时间(单位为毫秒)

示例:

1
2
3
4
5
6
7
8
9
10
11
# 每隔2秒报告一次所有硬盘的使用情况
iostat -d 2

# 每隔2秒报告一次所有硬盘的详细使用情况,总共报告6次
iostat -d 2 6

# 每隔2秒报告一次所有硬盘的详细使用情况
iostat -x -d 2

# 每隔2秒报告一次sda硬盘的详细使用情况
iostat -x sda -d 2

netstat

查看网络情况。

显示项Recv-Q, Send-Q表示网络接受队列,发送队列.一般情况下为0, 可接受短暂的非0状态。

示例

1
2
3
4
5
# 统计各个Tcp状态的连接有多少个
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

# 统计与nginx建立连接的IP,并包含各个IP的连接数
netstat -ntp | grep nginx | grep -v "127.0.0.1" | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c

tcpdump

抓包工具。

常用参数:

  • -i 指定网卡, 如果设置为any则表示抓取所有网卡
  • -w 将结果保存为wireshark可识别的文件, 可直接用wireshark进行分析

当有多个过滤条件时, 进行连接的操作符有:

  • and 且
  • or 或
  • not 非

过滤条件:

  • host 主机IP, 包含出和入
  • port 端口号
  • src ip包的源地址
  • dst ip包的目标地址

示例:

1
2
# 抓取所有网卡流量,并且过滤主机为192.168.1.23,端口为8123,将结果保存为dd.cap文件
tcpdump -i any host 192.168.1.23 and port 8123 -w dd.cap