Linux常用命令

参考



一.文件管理

1.文件查找:find

使用方法

 1find [查找目录] [查找条件]
 2
 3查找目录:
 4    .:在当前目录及子目录下查找(默认)
 5    A:在目录A及A的子目录下查找
 6查找条件:
 7    -name:根据文件名查找
 8    -regex:使用正则表达式匹配
 9    -type:按类型查找(f:文件,d:目录,l:链接...)
10    -atime:按访问时间查找(n:n天前的一天内,+n:n天前(不含n天本身),-n:n天内(不含n天)11    -mtime:按修改时间查找(n:n天前的一天内,+n:n天前(不含n天本身),-n:n天内(不含n天)12    -size:按大小查找(单位k,+nk:"比nk更大",-nk:"比nk更小"13    -perm:按权限查找(644:权限等于644的文件)
14    -user/-nouser:用户名等于/用户名不等于
15    -group/-nogroup:组名等于/组名不等于

示例

1#1.在当前目录及子目录下查找后缀为cpp的文件
2find . -name *.cpp
3
4#2.使用正则表达式查找
5find -regex ".*.cpp$"

2.文件拷贝:cp

使用方法

1cp [选项] 源路径 目的路径
2
3选项:
4    -a:将所有属性一起复制(包括拥有者、时间等信息)
5    -i:目标文件存在时,进行询问
6    -r:递归复制

3.打包解包:tar

使用方法

1tar [-j|-z] [cv] [-f 压缩包名] 目录
2tar [-j|-z] [xv] [-f 解压包名] [-C 解压路径]
3
4选项:
5    -c/-x:打包/解包
6    -j/-z:bzip2格式/gzip格式
7    -v:显示过程

二.文本处理

1.(显示行号)查看文件:nl

行号计算不包括空行

2.文本查找:grep

使用方法

1grep [选项] 模式串 文件
2输出 | grep [选项] 模式串
3
4选项
5    -e:使用多个模式串
6    -i:忽略大小写
7    -n:打印行号
8    -c:统计次数(一行算一次)

示例

1#1.在test.c中搜索包含字符串”printf“或”count“的行
2grep -e "printf" -e "count" test.c

3.排序:sort

使用方法

1sort [选项] 文件
2输出 | sort [选项]
3
4选项
5    -d:按字典序排序(默认)
6    -n:按数字排序
7    -k:"-k n"表示按各行第n列进行排序
8    -r:反序

4.转换:tr

使用方法

1#set1、set2为字符集,可以是单个字符,也可以是字符串
2输出 | tr [选项] set1 set2
3
4选项:
5    -d:删除字符
6    -s:字符压缩

示例

 1#1.删除字符':'
 2cat /etc/passwd | tr -d ':'
 3
 4#2.将小写字母替换成大写字母
 5last | tr '[a-z]' 'A-Z'
 6
 7#3.将'a'、'b'、'c'替换成'z'
 8cat test | tr “abc” 'z'
 9
10#4.将连续的'a'压缩成'b'(单个或连续出现的多个‘a’会压缩成一个‘b’)
11cat test | tr -s 'a' 'b'

5.切分文本:cut

使用方法

1cut [选项] 文件
2输出 | cut [选项]
3
4选项:
5    -d:分隔符(-d ':' 以’:‘为分隔符)
6    -f:选择域(-f 1,2 输出分隔后第1列和第2列)
7    -c:字符范围(-c n-m 输出第n到m个字符。如果没有m,输出到末尾)

示例

1#1.按’:‘分隔$PATH,输出第3个和第5个
2echo $PATH | cut -d ':' -f 3,5
3
4#2.输出export运行结果每行的第12-20个字符
5export | cut -c 12-20

6.拼接文本:paste

使用方法

1paste [选项] file1 file2
2
3选项:
4    -d:指定拼接时使用的分隔符(默认使用tab作为分隔符)

7.统计:wc

使用方法

1wc [选项] 文件
2输出 | wc [选项]
3
4选项:
5    -c:统计字符数
6    -w:统计单词数
7    -l:统计行数

8.数据处理:sed

sed常用于一整行的处理。如果有一个100万行的文件,要在第100行加某些文字,此时由于文件太大,不适合用vim处理。因此使用sed是个很好的选择

使用方法

 1sed [选项] '[动作]' 文件
 2输入 | sed [选项] '[动作]'
 3
 4选项:
 5    -n:安静模式,只输出sed处理过的行(否则未处理行也会输出)
 6    -i:结果直接作用到文件(没指定时不会修改文件)
 7    -e:在命令行模式上输入动作
 8    -f:从文件中读取动作
 9
10动作:[n1[,n2]] function
11function:
12    a/i:在后插入/在前插入
13    d:删除
14    p:打印
15    s:替换

示例

 1#1.插入
 2nl /etc/passwd | sed '2a drink tea' #在第2行后插入一行:"drink tea"
 3nl /etc/passwd | sed '2a aaa \
 4> bbb' #在第2行后插入两行:"aaa"和"bbb"
 5
 6#2.删除
 7nl /etc/passwd | sed '2,5d' #删除2~5行
 8sed '/^$/d' ip #将ip文件中的空行删除
 9
10#3.打印2~5行(安静模式,不使用安静模式2~5行会打印2次)
11nl /etc/passwd | sed -n '2,5p'
12
13#4.替换
14nl /etc/passwd | sed '2s/daemon/root/g' #将第二行的daemon替换成root
15ifconfig | grep 'inet addr' | sed 's/^.*addr://g' #将所有开头的“inet addr:”删除

9.数据处理:awk

相比于sed常用于一整行的处理,awk则比较倾向于将一行分成数个“字段”来处理。因此,相当适合小型的数据处理

awk处理步骤

  1. 读入第一行,并将第一行的数据填入$0,$1,$2等变量当中
  2. 依据条件类型的限制,判断是否需要进行后面的动作
  3. 做完所有的动作与条件类型
  4. 若还有后续的“行”的数据,则重复1~3步,直到所有的数据都读完为止

使用方法

 1awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
 2输出 | awk '条件类型1{动作1} 条件类型2{动作2} ...'
 3
 4变量:
 5    $0:整行
 6    $1:按分隔符分隔后的第1列
 7    $2:按分隔符分隔后的第2列
 8    $k:按分隔符分隔后的第k列
 9    NF:每一行拥有的字段数
10    NR:目前所处理的行数
11    FS:目前的分隔字符(默认是空格或tab)
12条件判断:>、<、>=、<===、!=
13命令分隔:使用';'或Enter

示例

1#1.打印last -n 5结果中每行经过分隔符(默认情况下为空格或tab)分隔后的第1列和第3列
2last -n 5 | awk '{print $1 "\t" $3}'
3
4#2.以':'作为分隔符,打印第3列小于10的所有行的第1列和第3列
5cat /etc/passwd | awk '{FS=":"} $3<10{print $1 "\t" $3}'      #(第一行不会处理)
6cat /etc/passwd | awk 'BEGIN{FS=":"} $3<10{print $1 "\t" $3}' #(第一行会处理)
7
8#3.假设test文件由3列数字组成,以空格分隔。该命令会计算每行的和然后打印
9awk '{total=$1+$2+$3;printf "%10d %10d %10d %10.2f\n",$1,$2,$3,total}' test

注意上面的示例2,awk首先是读取一行,分隔后的数据填入$0,$1,$2等变量中才开始进行条件判断和执行动作。因此第一条命令在按空格或tab分隔后才将分隔符换成':',所以第一行显示结果不对

三.性能分析

1.进程查询:ps

man ps手册非常庞大,不是很好查阅,因此主要记住几个命令

示例

1#1.列出仅与自身环境有关的进程,最上层的父进程是允许该ps命令的bash而没有扩展到init进程中去
2ps -l
3
4#2.列出系统所有进程的信息
5ps aux
6ps -ef    #aux会截断COMMAND列,-ef不会。aux是BSD风格,-ef是System V风格
7ps axjf   #以"进程树"的方式显示所有进程
8ps -lA    #输出格式同ps -l

  • F:进程标志,说明进程的权限
    • 4:root权限
    • 1:仅能fork而不能exec
    • 0:既非4也非1
  • S:进程的状态
    • R(running):正在运行
    • S(Sleep):可被唤醒的睡眠
    • D:不可被唤醒的睡眠(通常可能在等待I/O)
    • T:停止,可能是在后台暂停
    • Z(Zombie):僵尸进程
  • C:CPU使用率
  • PRI/NI:Priority/Nice的缩写,CPU优先级(越小越高)
  • ADDR/SZ/WCHAN:内存相关,ADDR指出进程在内存的哪个部分,running进程一般显示'-'。SZ为进程使用的内存。WCHAN表示进程当前是否运行中'-',当进程睡眠时,指出进程等待的事件
  • TTY:进程运行的终端机
  • TIME:进程用掉的CPU时间

  • USER:进程所属用户
  • %CPU/%MEM:进程消耗的CPU百分比和内存百分比
  • VSZ:进程用掉的虚拟内存(KB)
  • RSS:进程占用的固定内存(KB)
  • TTY:进程运行的终端机,与终端机无关则显示'?'。tty1~tty6是本机的登陆者程序,pts/0等表示由网络连接进主机的进程
  • STAT:进程目前的状态,与ps -l结果中的S等同
  • START:进程启动的时间
  • TIME:进程实际使用的CPU运行时间

2.进程监控:top

使用方法

1top [选项]
2
3选项:
4    -d:跟秒数指定更新间隔
5    -n:与-b搭配,指定需要进行几次top输出,重定向时常用
6    -p:指定PID,监控特定进程

top模式下的命令

  • ?:显示可用的命令
  • P:以CPU使用情况排序
  • M:以内存使用情况排序
  • N:以PID排序
  • q:退出
  • 1:多核情况下切换CPU

%Cpu(s)后面的“wa”表示I/O wait,过高说明长时间等待I/O,I/O存在瓶颈

3.打开文件查询:lsof

使用方法

1lsof [选项]
2
3选项:
4    -i:-i:端口号查看端口被占用的情况
5    -u:后跟用户名查看具体用户打开的文件
6    -p:后跟PID查看指定进程打开的文件
7    +d:后跟目录查看指定目录下被进程打开的文件,"+D"递归

4.内存使用量:free

使用方法

1free [选项]
2
3选项:
4    -b|-k|-m|-g:单位
5    -t:列出物理内存与swap的汇总情况    

  • buffers:主要缓存dentry和inode等元数据
  • cached:主要缓存文件内容,即page cache
  • - buffers/cache:实际使用的内存。used-buffers-cached
  • + buffers/cache:可用内存。free+buffers+cached(在内存紧张时,buffers和cached可以回收)

详细结果说明

5.shell进程的资源限制:ulimit

使用方法

1ulimit [选项]       #查看
2ulimit [选项] 新值  #修改
3
4选项:
5    -a:列出shell进程的所有资源限制情况(-a命令会列出查看某一资源限制的选项参数)
6    ...

使用ulimit修改资源限制只会对当前终端环境有效,如果想永久生效,可以修改文件/etc/security/limits.conf,该文件的内容如下;

 1# /etc/security/limits.conf
 2#
 3#Each line describes a limit for a user in the form:
 4#
 5#<domain>        <type>  <item>  <value>
 6#
 7#Where:
 8#<domain> can be:
 9#        - a user name
10#        - a group name, with @group syntax
11#        - the wildcard *, for default entry
12#        - the wildcard %, can be also used with %group syntax,
13#                 for maxlogin limit
14#        - NOTE: group and wildcard limits are not applied to root.
15#          To apply a limit to the root user, <domain> must be
16#          the literal username root.
17#
18#<type> can have the two values:
19#        - "soft" for enforcing the soft limits
20#        - "hard" for enforcing hard limits
21#
22#<item> can be one of the following:
23#        - core - limits the core file size (KB)
24#        - data - max data size (KB)
25#        - fsize - maximum filesize (KB)
26#        - memlock - max locked-in-memory address space (KB)
27#        - nofile - max number of open files
28#        - rss - max resident set size (KB)
29#        - stack - max stack size (KB)
30#        - cpu - max CPU time (MIN)
31#        - nproc - max number of processes
32#        - as - address space limit (KB)
33#        - maxlogins - max number of logins for this user
34#        - maxsyslogins - max number of logins on the system
35#        - priority - the priority to run user process with
36#        - locks - max number of file locks the user can hold
37#        - sigpending - max number of pending signals
38#        - msgqueue - max memory used by POSIX message queues (bytes)
39#        - nice - max nice priority allowed to raise to values: [-20, 19]
40#        - rtprio - max realtime priority
41#        - chroot - change root to directory (Debian-specific)
42#
43#<domain>      <type>  <item>         <value>
44#
45
46#*               soft    core            0
47#root            hard    core            100000
48#*               hard    rss             10000
49#@student        hard    nproc           20
50#@faculty        soft    nproc           20
51#@faculty        hard    nproc           50
52#ftp             hard    nproc           0
53#ftp             -       chroot          /ftp
54#@student        -       maxlogins       4
55
56# End of file

示例

 1root@068ca8da6d06:/# ulimit -a
 2core file size          (blocks, -c) 0
 3data seg size           (kbytes, -d) unlimited
 4scheduling priority             (-e) 0
 5file size               (blocks, -f) unlimited
 6pending signals                 (-i) 7863
 7max locked memory       (kbytes, -l) 82000
 8max memory size         (kbytes, -m) unlimited
 9open files                      (-n) 1048576
10pipe size            (512 bytes, -p) 8
11POSIX message queues     (bytes, -q) 819200
12real-time priority              (-r) 0
13stack size              (kbytes, -s) 8192
14cpu time               (seconds, -t) unlimited
15max user processes              (-u) unlimited
16virtual memory          (kbytes, -v) unlimited
17file locks                      (-x) unlimited

四.网络工具

1.网卡配置:ifconfig

2.查看当前网络连接:netstat

 1netstat [选项]
 2
 3选项:
 4    -a:将所有的连接、监听、Socket数据都列出来(如,默认情况下,不会列出监听状态的连接)
 5    -t:列出tcp连接
 6    -u:列出udp连接
 7    -n:将连接的进程服务名称以端口号显示(如下图中Local Address会换成10.0.2.15:22)
 8    -l:列出处于监听状态的连接
 9    -p:添加一列,显示网络服务进程的PID(需要root权限)
10    -i:显示网络接口列表,可以配合ifconfig一起分析
11    -s:打印网络统计数据,包括某个协议下的收发包数量

  • Active Internet connections(w/o servers):网络相关的连接
    • Recv-Q:接收队列(已接收还未递交给应用)
    • Send-Q:发送队列(接收方未确认的数据)
    • Local Address:本地IP(主机):端口(服务名)
    • Foreign Address:远端IP:端口
    • Recv-Q和Send-Q通常应该为0,如果长时间不为0可能存在问题

  • Active UNIX domain sockets(w/o servers):本地相关的套接字
    • RefCnt:连接到此socket的进程数
    • Flags:连接标识
    • Type:socket访问的类型
    • Path:连接到此socket的相关程序的路径

netstat的10个基本用法

3.查看路由表:route

4.检查网络连通性:ping

5.转发路径:traceroute

6.网络Debug分析:nc

7.命令行抓包:tcpdump

使用方法

1sudo tcpdump [选项] ...
2
3选项:
4    -D/-i:查看/指定网卡

示例

1#抓取本地9877号端口的TCP数据包
2sudo tcpdump -i lo tcp port 9877

下图为tcp回射服务器,客户端分别键入"hello"和“world”时,使用tcpdump抓取到的数据包

8.域名解析工具:dig

9.网络请求:curl

五.开发及调试

1.编辑器:vim

2.编译器:gcc和g++

C程序的编译过程

使用方法

 1gcc/g++ [选项] 源文件
 2
 3选项:
 4    -E:让编译器在预处理之后停止,不进行后续编译过程,得到.i文件
 5    -S:让编译器在编译之后停止 ,不进行后续过程,得到.s文件
 6    -c:生成机器码即二进制.o文件
 7    -o:指定目标文件名
 8    -g:在编译的时候生成调试信息
 9    -Wall:生成所有警告信息
10    -I 目录:指定头文件的查找目录
11    生成动态链接库:
12        1. gcc/g++ -c -fPIC 源文件 -o 目标文件名
13        2. gcc -shared 目标文件名 -o 动态链接库名.so
14    生成静态链接库:
15        1. gcc/g++ -c 源文件 -o 目标文件名
16        2. ar -crv 静态链接库名.a 目标文件名
17    -l库名 -L 目录:引入链接库,-L指定查找该库的目录。如-lm表示引入libm.so

3.调试工具:gdb

使用方法

 1#第一步:得到可执行文件
 2gcc/g++ -o 可执行文件 -g 源文件
 3
 4#第二步:启动gdb
 5gdb #启动gdb
 6
 7#第三步:执行gdb命令进行调试
 8(gdb) gdb命令
 9
10gdb命令:
11    file 可执行文件:导入需要调试的文件
12    r:运行程序
13    q:退出gdb
14    b:设置断点
15        b 行号
16        b 函数名称
17        b *函数名
18        b *代码地址
19        b 编号
20    c:继续执行,直到下一断点或程序结束
21    s:执行一行代码,如果此行代码有函数调用则进入函数
22    n:执行一行代码,如果此行代码有函数调用,不进入函数,直接执行函数
23    i(info) 子命令:查看某些信息(只输入info或i可以查看有哪些子命令)
24        info thread:查看进程的所有线程,会显示每个线程的序号(1~n)
25    thread 线程序号:切换到相应的线程(线程序号可以由info thread得到)
26    f(frame) 函数栈帧号:切换到相应的函数栈帧(函数栈帧号可以由where等命令得到)
27    list:查看源码
28        list 行号:查看指定行号附近的源码
29        list 函数:查看指定函数附近的源码
30        list 文件:行号:查看指定文件中指定行附近的代码
31    where:查看当前位置
32    p(print) /格式 表达式
33        格式:
34            x:按十六进制格式显示变量
35            d:按十进制格式显示变量
36            u:按十六进制格式显示无符号整形
37            o:按八进制格式显示变量
38            t:按二进制格式显示变量
39            a:按十六进制格式显示变量
40            c:按字符格式显示变量
41            f:按浮点数格式显示变量
42        表达式中可用的操作符:
43            @:一个和数组有关的操作符,左边是起始地址,右边是长度(p *arr@3)
44            :::指定一个在文件或是函数中的变量(p 'f2.c'::x)
45            {<type>}<addr>:一个指向内存<addr>的类型为type的一个对象
46    x(examine) <n/f/u> <addr>:查看内存
47        n:正整数,表示需要显示的内存单元个数
48        f:显示的格式(格式字母同上面的print)
49        u:每个单元的字节数
50            b:1字节
51            h:2字节
52            w:4字节(默认)
53            g:8字节

4.查看依赖库:ldd

5.二进制文件分析:objdump

6.ELF文件格式分析:readelf

7.跟踪进程中系统调用:strace

8.跟踪进程栈:pstack

9.进程内存映射:pmap

六.其他

1.终止进程:kill

2.修改文件权限:chmod

  • w权限不具有删除文件的能力
  • 目录的x权限表示能否进入目录

使用方法

1chmod [选项] [u|g|o|a][+|-][r|w|x] 文件或目录
2chmod [选项] 权限的数字表示 文件或目录
3
4选项:
5    -R:递归式的修改

3.创建链接:ln

4.显示文件尾:tail

5.版本控制:git

6.设置别名:alias