0%

Linux常用命令汇总

未来的你,一定会感谢现在拼命努力的自己。

常用

  1. ping

  2. ifconfig

  3. netstat

    • 通过pid查看占用端口netstat -nap | grep pid
    • 通过端口查看进程netstat -nap | grep 端口号
      • -p显示端口进程
  4. lsof

  5. tcpdump

  6. traceroute

  7. nslookup

  8. ssh

  9. top

  10. free

  11. du

  12. uname

  13. hostname

    • hostname -f
  14. sleep

    • linux支持s/m/h等时间单位,MacOS只支持s
  15. pwd

    • 默认显示的是连接路径
    • pwd -P可显示实际路径
  16. telnet

    • 连接redistelnet 127.0.0.1 6379

    • 连接百度telnet www.baidu.com 80

    • GET请求

    • telnet www.baidu.com 80

    • GET / HTTP/1.1

    • HOST:www.baidu.com

    • 回车

    • POST请求

    • telnet www.baidu.com 80

    • POST / HTTP/1.1

    • HOST:www.baidu.com

    • Content-type:application/x-www-form-urlencoded

    • Content-length:16

    • 回车空一行

    • c=Test&m=getName,应和Content-length大小保持一致

    • 退出telnet

    • control + ]

    • quit

  17. nc

    • 连接mysqlnc -zv 127.0.0.1 3306
    • 连接udpnc -vuz 127.0.0.1 9504
  18. strace

  19. openssl

  20. mtr


cut

  1. 作用:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
  2. 语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
用法:cut [选项]... [文件]...
从每个文件中输出指定部分到标准输出。

长选项必须使用的参数对于短选项时也是必需使用的。
-b, --bytes=列表 只选中指定的这些字节
-c, --characters=列表 只选中指定的这些字符
-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界
-f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified
-n with -b: don't split multibyte characters
--complement 补全选中的字节、字符或域
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入
的分界符
--help 显示此帮助信息并退出
--version 显示版本信息并退出

仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。

每种参数格式表示范围如下:
N 从第1 个开始数的第N 个字节、字符或域
N- 从第N 个开始到所在行结束的所有字符、字节或域
N-M 从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
-M 从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域

当没有文件参数,或者文件不存在时,从标准输入读取
  1. 准备文件a.json
1
2
3
4
5
id name age addr
1 liu 10 bj
2 ma 11 sh
3 li 10 tj
4 zhang 11 sz
  1. 使用

    • cut -d ' ' -f3,4 a.txt
    1
    2
    3
    4
    5
    age addr
    10 bj
    11 sh
    10 tj
    11 sz
    • cut -b1 a.txt
    1
    2
    3
    4
    5
    i
    1
    2
    3
    4
    • cut -c -2 a.txt
    1
    2
    3
    4
    5
    id
    1
    2
    3
    4
    • cut -c 2- a.txt
    1
    2
    3
    4
    5
    d name age addr
    liu 10 bj
    ma 11 sh
    li 10 tj
    zhang 11 sz

cut只允许间隔符是一个字符


sort

  1. 作用:将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码值进行比较,最后将他们按升序输出。
  2. 语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sort [选项]... [文件]...
或:
sort [选项]... --files0-from=F
串联排序所有指定文件并将结果写到标准输出。

长选项必须使用的参数对于短选项时也是必需使用的。
排序选项:

-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-M, --month-sort 比较 (未知) < "一月" < ... < "十二月"在LC_ALL=C 时为(unknown) < `JAN' < ... < `DEC'
-h, --human-numeric-sort 使用易读性数字(例如: 2K 1G)
-n, --numeric-sort 根据字符串数值比较
-R, --random-sort 根据随机hash 排序
--random-source=文件 从指定文件中获得随机字节
-r, --reverse 逆序输出排序结果
--sort=WORD 按照WORD 指定的格式排序:一般数字-g,高可读性-h,月份-M,数字-n,随机-R,版本-V
-V, --version-sort 在文本内进行自然版本排序

其他选项:

--batch-size=NMERGE 一次最多合并NMERGE 个输入;如果输入更多则使用临时文件
-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作
-C, --check=quiet, --check=silent 类似-c,但不报告第一个无序行
--compress-program=程序 使用指定程序压缩临时文件;使用该程序的-d 参数解压缩文件
--files0-from=文件 从指定文件读取以NUL 终止的名称,如果该文件被指定为"-"则从标准输入读文件名
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
-m, --merge 合并已排序的文件,不再进行排序
-o, --output=文件 将结果写入到文件而非标准输出
-s, --stable 禁用last-resort 比较以稳定比较算法
-S, --buffer-size=大小 指定主内存缓存大小
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-T, --temporary-directory=目录 使用指定目录而非$TMPDIR 或/tmp 作为临时目录,可用多个选项指定多个目录
-u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-z, --zero-terminated 以0 字节而非新行作为行尾标志
--help 显示此帮助信息并退出
--version 显示版本信息并退出
  1. 准备文件a.txt
1
2
3
4
5
6
aaa
ddd
bbb
aaa
fff
ccc
  1. 使用

    • sort a.txt
    1
    2
    3
    4
    5
    6
    aaa
    aaa
    bbb
    ccc
    ddd
    fff
    • sort -u a.txt
    1
    2
    3
    4
    5
    aaa
    bbb
    ccc
    ddd
    fff
    • sort -ru a.txt
    1
    2
    3
    4
    5
    fff
    ddd
    ccc
    bbb
    aaa

准备a.txt

1
2
3
4
5
6
7
5
2
1
11
3
5
6
  • sort a.txt

    1
    2
    3
    4
    5
    6
    7
    1
    11
    2
    3
    5
    5
    6
  • sort -n a.txt

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    5
    5
    6
    11

准备文件a.txt

1
2
3
4
bbb:30:2
aaa:10:3
ddd:1:3
ccc:20:4
  • sort a.txt

    1
    2
    3
    4
    aaa:10:3
    bbb:30:2
    ccc:20:4
    ddd:1:3
  • sort -n -k2 -t ':' a.txt

    1
    2
    3
    4
    ddd:1:3
    aaa:10:3
    ccc:20:4
    bbb:30:2

uniq

  1. 作用:将输入文件(或标准输入)中邻近的重复行写入到输出文件(或标准输出)中。
  2. 语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uniq [选项]... [文件]
从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。

不附加任何选项时匹配行将在首次出现处被合并。

长选项必须使用的参数对于短选项时也是必需使用的。
-c, --count 在每行前加上表示相应行目出现次数的前缀编号
-d, --repeated 只输出重复的行
-D, --all-repeated[=delimit-method 显示所有重复的行
delimit-method={none(default),prepend,separate}
以空行为界限
-f, --skip-fields=N 比较时跳过前N 列
-i, --ignore-case 在比较的时候不区分大小写
-s, --skip-chars=N 比较时跳过前N 个字符
-u, --unique 只显示唯一的行
-z, --zero-terminated 使用'\0'作为行结束符,而不是新换行
-w, --check-chars=N 对每行第N 个字符以后的内容不作对照
--help 显示此帮助信息并退出
--version 显示版本信息并退出
  1. 准备文件a.txt
1
2
3
4
5
bbb:30:2
aaa:10:3
ddd:1:3
ccc:20:4
ccc:20:4
  1. 使用1

    • uniq a.txt
    1
    2
    3
    4
    bbb:30:2
    aaa:10:3
    ddd:1:3
    ccc:20:4
    • sort a.txt | uniq,等同于sort -u a.txt
    1
    2
    3
    4
    aaa:10:3
    bbb:30:2
    ccc:20:4
    ddd:1:3
    • uniq -u a.txt
    1
    2
    3
    bbb:30:2
    aaa:10:3
    ddd:1:3
    • uniq -c a.txt
    1
    2
    3
    4
    1 bbb:30:2
    1 aaa:10:3
    1 ddd:1:3
    2 ccc:20:4
    • uniq -d a.txt
    1
    ccc:20:4
  2. 使用2

    • test.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    this is a test
    this is a test
    this is a test
    this is a Test
    i am tank
    i love tank
    i love tank
    this is a test
    whom have a try
    WhoM have a try
    you have a try
    i want to abroad
    those are good men
    we are good men
    this is a test
    • 测试

      • 去除相邻重复的行并统计输出重复的次数 uniq -c test.txt
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      3 this is a test
      1 this is a Test
      1 i am tank
      2 i love tank
      1 this is a test
      1 whom have a try
      1 WhoM have a try
      1 you have a try
      1 i want to abroad
      1 those are good men
      1 we are good men
      1 this is a test
      • 去除文本重复的行并统计输出重复的次数 sort test.txt | uniq -c
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      1 i am tank
      2 i love tank
      1 i want to abroad
      5 this is a test
      1 this is a Test
      1 those are good men
      1 we are good men
      1 whom have a try
      1 WhoM have a try
      1 you have a try

uniq只检测邻近的行是否重复,sort -u将输入文件先排序然后再处理重复行。


find

  1. find: paths must precede expression,多文件的查找的时候需要增加单引号

  2. 使用

    • 查看文件/文件夹所在分区/挂载点信息:df <路径>
    • 查找当前路径下文件大小大于800M的文件:find . -type f -size +800M
    • find . -type f -size +20M -print0 | xargs -0 ls -l --block-size=m
    • find . -type f -size +20M -print0 | xargs -0 du -h | sort -nr
    • 查找黄金 find ./ -type f -name "*.csv" | xargs grep "gold"
  3. 参考


scp

  1. scp命令用于Linux之间复制文件和目录
    • secure copy的缩写
    • Linux系统下基于ssh登陆进行安全的远程文件拷贝命令
  2. scp [可选参数] file_source file_target
  3. 可选参数
参数 意义
-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 保留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh
-l limit 限定用户所能使用的带宽,以Kbit/s为单位
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式
-P port 注意是大写的P, port是指定数据传输用到的端口号
-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项
  1. 实战

    • 准备

      • 机器A 192.168.1.1 name_a password_a
      • 机器B 192.168.1.1 name_b password_b
    • 在机器A上操作,将机器B /home/b.txt目录下b.txt文件拷贝到机器A对应目录下并更改名字a.txt

      scp name_b@192.168.1.2:/home/b.txt /home/a.txt

    • 在机器A上操作,将机器A /home/b.txt目录下a.txt文件拷贝到机器B对应目录下并更改名字b.txt

      scp /home/a.txt name_b@192.168.1.2:/home/b.txt

在本地使用此命令从服务器拷贝文件到本次目录,需要退出已登录的服务器


xargs

  1. 介绍
          xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据,还可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

    • xargs默认的命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理换行和空白将被空格取代。
  2. demo

    • 前期准备
1
2
3
4
mkdir /Users/your_name/Desktop/xargs
cd /Users/your_name/Desktop/xargs
touch 1.txt 2.txt 3.txt 4.txt
cd ~ # 这一步很重要,如果还是在当前目录操作,差异不是那么明显
  • 命令对比
1
2
3
4
5
6
7
8
9
10
11
12
find /Users/your_name/Desktop/xargs -name '*.txt' | ls -l

-rwxrwxrwx 1 playcrab staff 11 11 18 17:11 README.md
-rwxrwxrwx 1 playcrab staff 3162 11 25 14:51 _config.yml
-rw-r--r-- 1 playcrab staff 174 3 8 01:03 db.json
drwxrwxrwx 320 playcrab staff 10240 11 25 15:10 node_modules
-rwxrwxrwx 1 playcrab staff 145778 11 25 15:10 package-lock.json
-rwxrwxrwx 1 playcrab staff 749 11 25 15:10 package.json
drwxr-xr-x 18 playcrab staff 576 11 25 15:08 public
-rwxrwxrwx 1 playcrab staff 194 11 25 13:57 release.sh
drwxrwxrwx 5 playcrab staff 160 11 18 17:11 scaffolds
drwxrwxrwx 9 playcrab staff 288 11 18 17:18 source
1
2
3
4
5
6
find /Users/your_name/Desktop/xargs -name '*.txt' | xargs ls -l

-rw-r--r-- 1 playcrab staff 0 3 12 00:03 /Users/playcrab/Desktop/xargs/1.txt
-rw-r--r-- 1 playcrab staff 0 3 12 00:03 /Users/playcrab/Desktop/xargs/2.txt
-rw-r--r-- 1 playcrab staff 0 3 12 00:03 /Users/playcrab/Desktop/xargs/3.txt
-rw-r--r-- 1 playcrab staff 0 3 12 00:03 /Users/playcrab/Desktop/xargs/t.txt

管道

  1. 概念
          在类Unix操作系统(以及一些其他借用了这个设计的操作系统,如Windows)中,管道(英语:Pipeline)是一系列将标准输入输出链接起来的进程,其中每一个进程的输出被直接作为下一个进程的输入。 每一个链接都由匿名管道实现。管道中的组成元素也被称作过滤程序。这个概念是由道格拉斯·麦克罗伊为Unix 命令行发明的,因与物理上的管道相似而得名。

  2. 使用

1
2
3
mkfifo test
echo 123 > test
cat < test

如果想将一个命令或文件的内容作为另一个命令的参数而不是输入,管道线是不能实现的,三种常见的解决办法是:

xargs命令
带有-exec选项的 find 命令
命令替换

  1. 参考

top

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器(以下所有实验均基于CentOS6.2版本)。

  1. top -h
1
top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
  1. 常用
1
2
3
4
5
top   //每隔5秒显式所有进程的资源占用情况
top -d 2 //每隔2秒显式所有进程的资源占用情况
top -c //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

默认情况下仅PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND列,可通过输入相应参数

f:改变显示的内容
o:改变列的显示顺序
F:将进程按照相应的列进行排序
O:将进程按照相应的列进行排序
R:将当前的排序倒转

  1. 返回值说明

    • header部分
1
2
3
4
5
top - 20:14:08 up 1570 days,  9:16,  2 users,  load average: 0.25, 0.22, 0.27
Tasks: 331 total, 3 running, 327 sleeping, 0 stopped, 1 zombie
Cpu(s): 4.3%us, 3.1%sy, 0.0%ni, 92.2%id, 0.1%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 16331772k total, 16135152k used, 196620k free, 784104k buffers
Swap: 0k total, 0k used, 0k free, 7094008k cached

前五行是系统整体的统计信息。

第一行是任务队列信息,同uptime命令的执行结果,其内容如下:

1
2
3
4
20:14:08 #当前时间
up 1570 days, 9:16, #系统运行时间,格式为 天,时:分
2 users, #当前登录用户数
load average: 0.25, 0.22, 0.27 # 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

第二为进程信息:

1
2
3
4
5
total 进程总数
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数

第三行为CPU信息:

1
2
3
4
5
6
7
8
0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0%hi:硬中断占用百分比
0.0%si:软中断占用百分比
0.0%st:虚拟机占用百分比

最后两行为内存和Swap信息:

1
2
3
4
5
6
7
8
9
10
11
Mem:
191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量

Swap:
192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
  • content部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
序号  列名    含义
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
  1. 参考

alias


cat

  1. cat命令用于连接文件并打印到标准输出设备上,strings命令在对象文件或二进制文件中查找可打印的字符串。

  2. 语法cat -hcat --help

    • linux:cat [-AbeEnstTuv] [--help] [--version] filename
    • MacOS:cat [-benstuv] filename
      • -n--number:由1开始对所有输出的行数编号
      • -b--number-nonblank:和-n相似,只不过对于空白行不编号
      • -s--squeeze-blank:当遇到有连续两行以上的空白行就替换为一行的空白行
      • -v--show-nonprinting:使用^M-符号,除了LFDTAB之外
      • -E--show-ends: 在每行结束处显示$
      • -T--show-tabs: 将TAB字符显示为^I
      • -A--show-all相当于-vET选项
      • -e相当于-vE选项
      • -t相当于-vT选项
  3. strings

    • redis.so,使用cat会打印一堆乱码
    • strings /your_path/redis.so
  4. 使用

1
2
3
4
123
456
789
1234
  • cat 1.txt | grep 123 | grep 1234 |xargs echo >> 2.txt

  • shell脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash
for i in `ls ./online_Money`
do
tar -zxvf ./online_Money/$i
for j in `ls ./data/userData/log/20140401/623205`
do
cat ./data/userData/log/20140401/623205/$j | grep 8300 | grep 623205_101_x | xargs printf "%s\n" >> ./2.log
done
done
  1. 参考

column

  1. column命令用于格式化输出信息。

  2. 语法cat -hcat --help

    • -c 字符数: 指定显示的列宽
    • -s "分隔符": 使用-t选项时,指定分隔符(允许指定多个分隔符)
    • -t:判断输入行的列数来创建一个表。分隔符是使用在-s中指定的字符。如果没有指定分隔符,默认是空格
    • -x:更改排列顺序(左→右)。默认的顺序为(上→下)
  3. 使用

1
2
123:456:789:111
abc:def:fgh:iii
  • cat a.txt
1
2
123:456:789:111
abc:def:fgh:iii
  • cat a.txt | column -c 80
1
123:456:789:111	abc:def:fgh:iii
  • cat a.txt | column -s “:”
1
123:456:789:111	abc:def:fgh:iii
  • cat a.txt | column -s “:” -t
1
2
123  456  789  111
abc def fgh iii
  • go tool dist list | column -c 75

curl

curl是常用的命令行工具,用来请求Web服务器。它的名字就是客户端(client)的URL工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话完全可以取代Postman这一类的图形界面工具。

  1. curl是一个利用URL规则在命令行下工作的文件传输工具,是一款很强大的http命令行工具。

    • 支持文件的上传和下载
    • 支持包括HTTP、HTTPS、FTP等众多协议
  2. 语法 curl [option] [url]

    • option参数详解见curl -h
  3. 常用

    • POST请求curl -d key=value url
    • GET请求curl -G -d key=value url
    • 保存访问的网页
      • 使用linux的重定向功能保存 curl http://study.com >> linux.html
      • 可以使用curl的内置-o(小写)保存网页 curl -o linux.html http://study.com
      • 可以使用curl的内置-O(大写)保存网页中的具体文件 curl -O http://study.com/hello.sh
    • 测试网页返回值 curl -o /dev/null -s -w %{http_code} www.linux.com
    • 指定proxy服务器以及其端口通过使用-x curl -x 192.168.100.100:1080 http://study.com
    • cookie的使用
      • 保存http的response里面的cookie信息到cookiec.txt,使用内置-c(小写),curl -c cookiec.txt http://study.com
      • 保存http的response里面的header信息到cookied.txt,使用内置-D(大写) curl -D cookied.txt http://study.com
      • 使用cookie通过内置-b,即curl -b cookiec.txt http://study.com
    • 模仿浏览器通过-A设定header信息 curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://study.com
    • 伪造referer通过-e设定curl -e "www.linux.com" http://mail.linux.com
    • 下载文件
      • 使用内置-o(小写)curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
      • 使用内置-O(大写)curl -O http://study.com/dodo1.JPG
      • 循环下载 curl -O http://study.com/dodo[1-5].JPG,这样就会把dodo[1-5].JPG全部保存下来
      • 下载重命名
        • curl -O http://study.com/{hello,bb}/dodo[1-5].JPG
        • curl -o #1_#2.JPG http://study.com/{hello,bb}/dodo[1-5].JPG
      • 分块下载使用内置-r
        • curl -r 0-100 -o dodo1_part1.JPG http://study.com/dodo1.JPG
        • curl -r 100-200 -o dodo1_part2.JPG http://study.com/dodo1.JPG
        • curl -r 200- -o dodo1_part3.JPG http://study.com/dodo1.JPG
        • cat dodo1_part* > dodo1.JPG ##将下载好的各块拼装好dodo1.JPG的内容了
      • 通过ftp下载文件
        • curl -O -u 用户名:密码 ftp://www.linux.com/dodo1.JPG
        • curl -O ftp://用户名:密码@www.linux.com/dodo1.JPG
      • 显示下载进度条 curl -# -O http://study.com/dodo1.JPG
      • 不显示下载进度信息 curl -s -O http://study.com/dodo1.JPG
    • 断点续传通过内置-C实现curl -C -O http://study.com/dodo1.JPG
    • 上传文件通过内置-T实现curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/
    • 显示抓取错误 curl -f http://study.com/error

declare

  1. 语法:declare [选项] [name[=value]]

    • 选项

      • -a:创建数组(如果支持)。

      • -A:创建关联数组(如果支持)。

      • -f:将操作或显示限制为函数名及函数定义。

      • -F:只显示函数名(调试时附加行号和源文件)。

      • -i:增加整型属性。

      • +i:删除整型属性。

      • -r:增加只读属性。

      • -t:增加追踪属性。

      • +t:删除追踪属性。

      • -x:增加导出属性。

      • +x:删除导出属性。

      • -p:显示每个名称的属性和值。

      • -g:在shell函数中使用时创建全局变量,其他情况下忽略(如果该选项存在,mac不支持)。

      • -l:增加小写属性,变量的值将转换为小写(如果该选项存在,mac不支持)。

      • +l:删除小写属性(如果该选项存在,mac不支持)。

      • -n:增加引用属性(如果该选项存在,mac不支持)。

      • +n:删除引用属性(如果该选项存在,mac不支持)。

      • -u:增加大写属性,变量的值将转换为大写(如果该选项存在,mac不支持)。

      • +u:删除大写属性(如果该选项存在,mac不支持)。

    • 参数

      • name:可选,变量名或函数名。
      • value:可选,变量的值。
    • 正常执行后返回true

  2. 作用:声明变量,设置或显示变量的值和属性。

    • 显示包含指定属性的全部变量和值
    • 显示包含指定属性的一到多个变量和值
    • 显示一到多个变量的属性和值
    • 显示所有变量的属性和值并显示函数的定义
    • 显示所有变量的属性和值
    • 显示所有全局变量的属性和值
    • 显示全部函数名和函数定义
    • 只显示全部函数名
    • 显示一到多个函数名和函数定义
    • 只显示一到多个函数名
    • 声明全局变量(可选:赋值)
    • 声明变量(可选:赋值、属性)
    • 增加、删除变量的属性(可选:赋值)
  3. 使用

  4. 参考


echo

echo:Shell的echo指令与PHP的echo指令类似,都是用于字符串的输出,命令格式:echo string.

  1. 参考一

expect

  1. expect是由Don Libes基于Tcl(全称Tool Command Language)语言开发的,主要应用于自动化交互式操作的场景,借助expect处理交互的命令可以将交互过程如ssh登录,ftp登录等写在一个脚本上,使之自动化完成。它尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

主要涉及以下四个命令:

命令 作用
send 用于向进程发送字符串
expect 从进程接收字符串
spawn 启动新的进程
interact 允许用户交互
  1. 知识点

    • 脚本执行时用expect shell.sh或在脚本中调用expect child.sh
    • 向一个脚本传递参数时,expect将参数值保存在数组$argv中,$argc表示参数个数
    • 在脚本中将对应参数赋值给变量set 变量名 [lindex $argv n],n取值0~n(参数个数)
    • 若登陆后便退出远程终端,则写expect eof即可
  2. 使用

    • 将需要登录的机器单独放一个配置文件,如config
1
2
3
ip1:username1:password1:22:connect1
ip2:username2:password2:22:connect2
ip3:username3:password3:22:connect3
  • 登录脚本login.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash

oIFS="$IFS"

j=1
for i in `cat config`
do
IFS=":"
#echo $i
str=($i) #初始化数组
echo $j ${str[1]}---${str[2]}
let j++
done

IFS="$oIFS"

read num

filter=`sed -n "$num p" config`
#echo $filter

IFS=":"
str=($filter)
echo ${str[@]}
host=${str[0]}
username=${str[1]}
password=${str[2]}
port=${str[3]}

./expect.sh $host $username $password $port
  • 交互脚本expect.sh
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/expect

set timeout 30
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set port [lindex $argv 3]

spawn ssh -p $port $username@$host
expect "password" {send "$password\r"}

interact
  • 执行./login.sh,输入数字即可登录对应的服务器
  1. 参考

export

  1. export命令用于设置或显示环境变量。

    • 可新增、修改、删除环境变量
    • 只可作用于本次登录操作
  2. 知识点

    • 在shell脚本中,不加export命令设置的环境变量只在本shell生效,加上则对本shell及其子shell都生效。

      • 举个例子
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      ①在终端中键入以下命令
      my_name=liusir

      ②新建echo.sh
      #!/bin/bash
      echo $my_name

      ③运行echo.sh:`bash echo.sh`,无任何输出

      ④在终端中键入以下命令
      export another_name=liuliu

      ⑤修改echo.sh
      #!/bin/bash
      echo $my_name
      echo $another_name

      ⑥运行echo.sh:`bash echo.sh`,可以看到liuliu正常输出
      • 再举个例子
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      ①销毁之前例子的变量unset my_name another_name

      ②创建脚本parent.sh
      #!/bin/bash
      my_name=liusir
      echo "parent shell: $my_name"
      bash child.sh

      ③创建脚本child.sh
      #!/bin/bash
      echo "child shell: $my_name"

      ④运行parent.sh:`bash parent.sh`,得到结果如下
      parent shell:liuliuliu
      child shell:

      ⑤修改parent.sh,变量前增加export
      #!/bin/bash
      export my_name=liusir
      echo "parent shell: $my_name"
      bash child.sh

      ⑥运行parent.sh:`bash parent.sh`,得到结果如下
      parent shell:liuliuliu
      child shell:liuliuliu
    • 直接输入export会将显示bash下的所有环境变量

      • env、set、export、declare都可以显示shell的变量
        • env与export输出的是环境变量
        • set与declare是输出环境变量和自定义变量
  3. 扩展

    • bash./都是用来执行shell脚本的,使用bash时脚本可以无执行权限,./脚本必须有可执行权限
    • source命令通常用于重新执行刚修改的初始化文档,如执行上文的source parent.sh

kill

Mac

  1. 作用:用于删除执行中的程序或工作。

  2. 语法

    • kill [-s signal_name] pid
    • kill -l [exit_status]
    • kill -signal_name pid
    • kill -signal_number pid
  3. 查看所有信号kill -l

1
2
3
4
HUP  INT    QUIT  ILL   TRAP  ABRT  EMT   FPE 
KILL BUS SEGV SYS PIPE ALRM TERM URG
STOP TSTP CONT CHLD TTIN TTOU IO XCPU
XFSZ VTALRM PROF WINCH INFO USR1 USR2

常用信号

  • 1 HUP(hang up)
  • 2 INT(interrupt)
  • 3 QUIT(quit)
  • 6 ABRT(abort)
  • 9 KILL(non-catchable, non-ignorable kill)
  • 14 ALRM(alarm clock)
  • 15 TERM(software termination signal)

Linux

  1. 作用:用于删除执行中的程序或工作。

  2. 语法

    • kill [-s signal | -p] [-q sigval] [-a] [–] pid…
    • kill -l [signal]
  3. 查看所有信号kill -l

1
2
3
4
5
6
7
8
9
10
11
12
13
 1) SIGHUP	     2) SIGINT	     3) SIGQUIT	     4) SIGILL	     5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。

常用信号:

  • HUP 1 终端断线
  • INT 2 中断(同Ctrl + C)
  • QUIT 3 退出(同Ctrl + \)
  • KILL 9 强制终止
  • TERM 15 终止
  • CONT 18 继续(与STOP相反)
  • STOP 19 暂停(同Ctrl + Z)

常用

  1. 杀死进程 kill 进程id
  2. 彻底杀死进程 kill -9 进程id
    • 查出服务的进程id ps aux |grep nginx
    • 杀死进程 kill -9 3645

      直接杀死程序 pkill -9 nginx或批量杀死进程killall -9 nginx

  3. 杀死指定用户进程
  4. 获取所有信号 kill -l
    • 获取指定信号值 kill -l signal_name

ln

  1. 语法 ln [参数][源文件或目录][目标文件或目录]

  2. 参数说明

    • 必要参数
    1
    2
    3
    4
    5
    6
    7
    -b 删除,覆盖以前建立的链接
    -d 允许超级用户制作目录的硬链接
    -f 强制执行
    -i 交互模式,文件存在则提示用户是否覆盖
    -n 把符号链接视为一般目录
    -s 软链接(符号链接)
    -v 显示详细的处理过程
    • 可选参数
    1
    2
    3
    4
    -S "-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"
    -V "-V<备份方式>"或"--version-control=<备份方式>"
    --help 显示帮助信息
    --version 显示版本信息
  3. demo

    • 创建软连接 ln -f /usr/loca/mysql/bin/mysql /usr/local/bin/mysql
  4. 扩展

    • 软连接
      • 软链接以路径的形式存在,类似于Windows操作系统中的快捷方式
      • 软链接可以跨文件系统,硬链接不可以
      • 软链接可以对一个不存在的文件名进行链接
      • 软链接可以对目录进行链接
    • 硬链接
      • 硬链接,以文件副本的形式存在,但不占用实际空间。
      • 不允许给目录创建硬链接
      • 硬链接只有在同一个文件系统中才能创建

lsof

  1. lsof(list open files)是一个列出当前系统打开文件的工具。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

  1. 语法lsof [option] [filename]

    • -a 列出打开文件存在的进程
    • -c<进程名> 列出指定进程所打开的文件
    • -g 列出GID号进程详情
    • -d<文件号> 列出占用该文件号的进程
    • +d<目录> 列出目录下被打开的文件
    • +D<目录> 递归列出目录下被打开的文件
    • -n<目录> 列出使用NFS的文件
    • -i<条件> 列出符合条件的进程,搜多条件可为IPV4/6地址、协议、:端口、 @ip等
    • -p<进程号> 列出指定进程号所打开的文件
    • -u 列出UID号进程详情
    • -h 显示帮助信息
    • -v 显示版本信息
  2. 常用参数选项

  3. 输出各列说明

    • COMMAND:进程的名称 PID:进程标识符
    • USER:进程所有者
    • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等
    • DEVICE:指定磁盘的名称
    • SIZE:文件的大小
    • NODE:索引节点(文件在磁盘上的标识)
    • NAME:打开文件的确切名称
  4. 实战

    • 打开一个具体文件的进程 lsof /usr/local/nginx/sbin/nginx
    • 列出一个目录下的进程,+D迭代,+d非迭代 lsof +D /usr/local/nginx1.15.12
    • 以进程名称为开始字符的进程,使用-c参数 lsof -c 进程名 [-c 进程名...]
    • 指定具体的某个用户的进程 lsof -u username
    • 使用or/and组合命令
      • 默认or lsof -u app -c init
      • and加-a参数 lsof -u app -c init -a
    • 使用-i参数列出所有的网络链接信息 lsof -i
    • 通过具体的进程ID来显示正在使用的进程信息 lsof -i -p PID -a
    • 通过使用-i:port来显具体端口进程信息 lsof -i:80
    • 列出所有TCP和UDP连接 lsof -i tcp/udp
      • 列出指定范围内被打开的TCP端口 lsof -i tcp:1-1024
    • 列出所有的网络文件系统的文件 lsof -N
    • 列出IPv4或IPv6打开的文件 lsof -i4/i6
    • 统计系统打开的文件总数 sudo lsof -P -n | wc -l
      • -P 选项表示不解析端口号
      • -n 选项表示不解析主机名
    • 查看删除文件的进程是否结束lsof | grep deleted
  5. 参考


split

split:一个100G的文件,内存只有4G,那么问题来了,如何对其进行全排序?


test

  1. Shell中的test命令用于检查某个条件是否成立,它可以进行数值、字符和文件以及逻辑运算等方面的测试。[]功能和test命令一样,只是不同的写法,同时[[]]也可在部分情况下代替[]

  2. 使用

    • 文件检测
      • 文件类检测
        • -e file:文件是否存在(exist)
        • -f file:文件是否存在且为普通文件(file)
        • -d file:文件是否存在且为目录(directory)
        • -b file:文件是否存在且为块设备(block device)
        • -c file:文件是否存在且为字符设备(character device)
        • -S file:文件是否存在且为套接字文件(Socket)
        • -p file:文件是否存在且为命名管道文件FIFO(pipe)
        • -L file:文件是否存在且是一个链接文件(Link)
      • 文件属性检测
        • -r file:文件是否存在且当前用户可读
        • -w file:文件是否存在且当前用户可写
        • -x file:文件是否存在且当前用户可执行
        • -u file:文件是否存在且设置了SUID
        • -g file:文件是否存在且设置了SGID
        • -k file:文件是否存在且设置了sbit(sticky bit)
        • -s file:文件是否存在且大小大于0字节,即用于检测文件是否为非空白文件
        • -N file:文件是否存在,且自上次read后是否被modify
      • 两个文件之间的比较
        • file1 -nt file2:判断file1是否比file2新,即newer than
        • file1 -ot file2:判断file1是否比file2旧,即older than
        • file1 -ef file2:判断file2与file2是否为同一文件,可用在判断hard link的判定上。主要意义在判定,两个文件是否均指向同一个分区上的同一个inode,即equal file
    • 数值检测(支持正负整数,不支持浮点数)
      • int1 -eq int2:两数值相等(equal)
      • int1 -ne int2:两数值不等(not equal)
      • int1 -gt int2:int1大于int2(greater than)
      • int1 -lt int2:int1小于int2(less than)
      • int1 -ge int2:int1大于等于int2(greater than or equal)
      • int1 -le int2:int1小于等于int2(less than or equal)
    • 字符串检测
      • -z string:判定字符串是否为空(zero),为空则返回true。
      • string-n string:判定字符串是否非空,为空则false。
        • 注:-n可省略
      • string1 = string2string1 == string2:string1和string2是否相同,相同则返回true。
        • ===等价,但=可移植性更好
      • str1 != str2:str1是否不等于str2,不等则返回true。
      • str1 > str2:str1字母顺序是否大于str2,大于则返回true。
      • str1 < str2:str1字母顺序是否小于str2,小于则返回true。
    • 逻辑检测
      • -a&&:两表达式同时为true时才为true。
        • -a只能在test[]中使用,&&只能在[[]]中使用
      • -o||:两表达式任何一个true则为true。
        • -o只能在test[]中使用,||只能在[[]]中使用
      • !:对表达式取反
      • ( ):用于改变表达式的优先级,为了防止被shell解析,应该加上反斜线转义\( \)
  3. 参考


ssh-keygen

  1. Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接,其最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。在设计上,SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rlogin、rsh、rexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。
  2. ssh-keygen命令用于为ssh生成、管理和转换认证密钥,Linux下可通过ssh-keygen /?方式查看其具体用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
usage: ssh-keygen [options]
Options:
-a trials Number of trials for screening DH-GEX moduli.
-B Show bubblebabble digest of key file.
-b bits Number of bits in the key to create.
-C comment Provide new comment.
-c Change comment in private and public key files.
-D pkcs11 Download public key from pkcs11 token.
-e Convert OpenSSH to RFC 4716 key file.
-F hostname Find hostname in known hosts file.
-f filename Filename of the key file.
-G file Generate candidates for DH-GEX moduli.
-g Use generic DNS resource record format.
-H Hash names in known_hosts file.
-h Generate host certificate instead of a user certificate.
-I key_id Key identifier to include in certificate.
-i Convert RFC 4716 to OpenSSH key file.
-L Print the contents of a certificate.
-l Show fingerprint of key file.
-M memory Amount of memory (MB) to use for generating DH-GEX moduli.
-N phrase Provide new passphrase.
-O option Specify a certificate option.
-P phrase Provide old passphrase.
-p Change passphrase of private key file.
-q Quiet.
-R hostname Remove host from known_hosts file.
-r hostname Print DNS resource record.
-S start Start point (hex) for generating DH-GEX moduli.
-s ca_key Certify keys with CA key.
-T file Screen candidates for DH-GEX moduli.
-t type Specify type of key to create.
-V from:to Specify certificate validity interval.
-v Verbose.
-W gen Generator to use for generating DH-GEX moduli.
-y Read private key file and print public key.
-Z name,... User/host principal names to include in certificate
-z serial Specify a serial number.

ssh用法,传送门

  1. 使用

    • github配置

      • cd ~/.ssh

      • ssh-keygen -t rsa -C "186********@173.com"

      • cat id_rsa.pub,复制其内容

      • 登录github

        • 点击个人界面
        • 选择Settings
        • 选择SSH and GPG keys
        • New ssh key
        • 自定义一个名字,并将复制的内容粘贴到文本框,保存退出
        • ssh -vT git@github.com,成功后会有类似如下输出:
        1
        Hi liusirdotme! You've successfully authenticated, but GitHub does not provide shell access.

        以上只是最基础的操作,是在没有更改过~/.ssh/config的基础上进行的,更高阶的操作是修改config,等有需求的时候再说这种情况。

  1. 参考

strace和dtruss

  1. strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

  2. 使用,可通过命令man dtruss来查看

    • -c:统计每一系统调用的所执行的时间,次数和出错的次数等。
    • -d:输出strace关于标准错误的调试信息。
    • -f:跟踪由fork调用所产生的子进程。
      • -ff:如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号。
    • -F:尝试跟踪vfork调用。在-f时,vfork不被跟踪。
    • -h:输出简要的帮助信息。
    • -i:输出系统调用的入口指针。
    • -q:禁止输出关于脱离的消息。
    • -r:打印出相对时间关于,每一个系统调用。
    • -t:在输出中的每一行前加上时间信息。
      • -tt:在输出中的每一行前加上时间信息,微秒级。
      • -ttt:微秒级输出。
    • -T:显示每一调用所耗的时间。
    • -v:输出所有的系统调用。一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出。
    • -V:输出strace的版本信息。
    • -x:以十六进制形式输出非标准字符串
    • -xx:所有字符串以十六进制形式输出。
    • -a column:设置返回值的输出位置,默认为40。
    • -o filename:将strace的输出写入文件filename
    • -p pid:跟踪指定的进程pid
    • -s strsize:指定输出的字符串的最大长度,默认为32。
    • -u username:以usernameUIDGID执行被跟踪的命令
    • -e expr:指定一个表达式,用来控制如何跟踪。
  3. strace telnet www.baidu.com 500


dtruss

  1. dtruss:使用DTrace来监视系统调用,在进程进行系统调用的时候进行输出。它就像DTrace版的truss,和truss相比,它插入一些信息。值得注意的是只有在有root权限的终端下才可以使用DTrace(Mac下需要关闭SIP,即csrutil disable)。

  2. 使用,可通过命令man dtruss来查看

    • -a:print all details
    • -b bufsize
      • dynamic variable buffer size. Increase this if you notice
      • dynamic variable drop errors. The default is “4m” for 4 megabytes per CPU.
    • -c:print system call counts
    • -d:print relative timestamps, us
    • -e:print elapsed times, us
    • -f:follow children as they are forked
    • -l:force printing of pid/lwpid per line
    • -L:don’t print pid/lwpid per line
    • -n name:examine processes with this name
    • -W name:wait for a process matching this name
    • -o:print on-cpu times, us
    • -s:print stack backtraces
    • -p PID:examine this PID
    • -t syscall:examine this syscall only

dtrace

  1. dtrace:全称Dynamic Tracing,译为动态跟踪,是由Sun™开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。

除Solaris系列以外,Dtrace已先后被移植到FreeBSD、NetBSD及MacOS等操作系统上。

  1. 参考

tar

  1. tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。

    • 五个独立命令
      • -c: 建立压缩档案
      • -x:解压
      • -t:查看内容
      • -r:向压缩归档文件末尾追加文件
      • -u:更新原压缩包中的文件
    • 常见可选命令
      • -z:有gzip属性的
      • -j:有bz2属性的
      • -Z:有compress属性的
      • -v:显示所有过程
      • -O:将文件解开到标准输出
      • -p:使用原档案的原来属性(属性不会依据使用者而变)
      • –exclude filename:在压缩的过程中过滤掉filename文件
    • 必选参数
      • -f: 使用档案名字(命令的最后一个参数,后面只能接档案名)
  2. 例子

    • 压缩

      • tar –cvf jpg.tar *.jpg 将目录里所有jpg文件打包成tar.jpg
      • tar -rvf jpg.tar add.jgp 将add.jpg追加到jgp.tar
      • tar –czf jpg.tar.gz *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过名为jpg.tar.gz的包
      • tar –cjf jpg.tar.bz2 *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过名为jpg.tar.bz2的包
      • tar –cZf jpg.tar.Z *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过名为 * jpg.tar.Z的包
      • rar a jpg.rar *.jpg rar格式的压缩,需要先下载rar for linux
      • zip jpg.zip *.jpg zip格式的压缩,需要先下载zip for linux
    • 解压

      • tar –xvf file.tar 解压 tar包
      • tar -xzvf file.tar.gz 解压tar.gz
      • tar -xjvf file.tar.bz2 解压 tar.bz2
      • tar –xZvf file.tar.Z 解压tar.Z
      • unrar e file.rar 解压rar
      • unzip file.zip 解压zip
  3. 注意:使用gzip压缩的文件不能追加,如tar -czvf test.tar.gz 1.txt,然后tar -rvf test.tar.gz 2.txt,报错Cannot append to compressed archive


脚本收集

  1. 查询大文件和目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
dir1=`du -m /* |sort -n |tail -1 |awk '{print $2}'`
cd $dir1
while :
do
dir2=`du -m ./* |sort -n |tail -1 |awk '{print $2}'`
if [ -d $dir2 ]
then
cd $dir2
else
dir3=`pwd`
break
fi
done
file=`du -m ./* |sort -n |tail -1 |awk '{print $2}'`
echo "The max_size_dir is : $dir3"
echo "The size is : `du -m $dir3 | awk '{print $1}'`M"
echo "The max_size_file is: `which $file`"
echo "The size is : `du -m $dir2 | awk '{print $1}'`M”