Linux知识点

命令

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
pwd
显示当前路径,-p显示真实路径

cd
切换当前目录

ls
显示目录与文件信息

touch
创建或修改文件时间

mkdir
创建目录,-p创建多级目录

cp
复制,-r递归,-a保留属性

rm
删除,-f强制,-i询问,-r递归

mv
移动/重命名

find
-empty 查找空白文件或目录
-group 按组查找
-size 按容量大小查找
-type 按文档类型查找,文件(f)、目录(d)、设备(b, c)、链接(l)等
-user 按用户查找
-exec 对找到的档案执行特定的命令
-a 并且
-o 或者
find -name hello.doc
find / -name "*.log"
find / -mtime -3 查看计算机中所有3天内被修改的文档
find / -mtime +4 查看计算机中所有4天前被修改过的文档
find / -mtime 2 查看计算机中2天前的当天被修改过的文档
find ./ -size +1M -exec ls -l {} \;

du
计算文件或目录的容量
-h 人性化显示容量信息
-a 查看所有目录以及文件的容量信息
-s 仅显示总容量

df
通过查看文件系统磁盘块分配图得出总块数与剩余块数

文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分
布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,
通常称为Meta Data。du命令是用户级的程序,它不考虑Meta Data,而df命令
则查看文件系统的磁盘分配图并考虑Meta Data。因此正常情况下,df计算的
USED空间会比du计算的结果要稍大。

简单的说,某个或者某些进程在没有释放掉删除了的文件而导致的。

cat
查看文件内容

more/less
分页查看

head/tail
-c nK 显示前KB/后KB的内容
-n 显示前n行/后n行的内容
-f 动态查看

wc
-c 显示字节统计信息
-l 显示行数统计信息
-w 显示单词统计信息

grep
查找关键词并打印匹配的行

ln
硬链接
-s 软链接

gzip
压缩与解压缩
-d 解压

bzip2
压缩与解压缩
-d 解压

tar
打包与解包
-c 打包
-x 解包
-z 用gzip压缩解压
-j 用bzip2压缩解压

cut

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
cut 从一个文本文件或者文本流中提取文本列。

-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;

echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
# 1 | 2 | 3 | 4 | 5 | 6 | 7


找出第五个路径
#echo $PATH | cut -d ':' -f 5
/usr/local/bin

找出第三和第五个路径
#echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin


找出第三到最后一个路径
echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

找出第一到第三个路径
#echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:


找出第一到第三,还有第五个路径
echo $PATH | cut -d ':' -f 1-3,5
/bin:/usr/bin:/sbin:/usr/local/bin

sort和uniq

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
sort
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-n 依照数值的大小排序。
-o <输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t <分隔字符> 指定排序时所用的栏位分隔字符。

排序文件,默认是去重
#cat words | sort |uniq
friend
hello
world


排序之后删除了重复行,同时在行首位置输出该行重复的次数
#sort testfile | uniq -c
1 friend
3 hello
2 world


仅显示存在重复的行,并在行首显示该行重复的次数
#sort testfile | uniq -dc
3 hello
2 world


仅显示不重复的行
sort testfile | uniq -u
friend

单词计数

1
cat a | tr -s ' ' '\n' | tr -d '[,."]' | sort | uniq -c | sort -nr

用户权限

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
useradd
创建新账号

groupadd
创建组账户

id
显示账户及组信息

passwd
改密码
-l 锁定用户
-u 解锁

usermod
修改账户信息

userdel
删除用户

groupdel
删除组账户

/etc/passwd 账户信息文件
/etc/shadow 账户密码文件
/etc/group 组账户信息文件
/etc/gshadow 组账户密码文件

chmod
改变文件或目录权限

chown
修改文件或目录的所有者与所属组

服务任务

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
systemctl
start 启动
stop 关闭服务
restart 重启
enable 设置默认开机启动
disable 设置服务开机禁用

at
一次性计划任务,首先要systemctl start atd和systemctl enable atd
-l 查看用户计划任务
-d 删除用户计划任务
-c 查看at计划任务具体内容

crontab
周期性计划人
-u 指定用户
-l 查看计划任务
-r 删除计划任务
-e 编辑计划任务
-i 删除时询问
格式:
分 时 日 月 周 命令
23 23 * * 5 命令 每周五晚23点23分
00 */3 * * * 命令 每3个小时
00 10 * * 3,5 命令 每周三、周五10点

监控

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
uptime
监控CPU使用情况

free
监控内存和交换分区使用情况

ip
查看网卡情况

netstat
查看网络连接、路由表、网络接口统计等信息

-s 显示各种协议数据统计信息
-n 使用数字形式的IP、端口号、用户ID代替主机、协议、用户等信息
-p 显示进程及对应的PID
-l 仅显示正在监听的sockets接口信息
-u 查看udp
-t 查看tcp

ps
axu 查看当前进程信息

Linux上进程有五种状态
1. 运行
2. 中断
3. 不可中断
4. 僵死
5. 停止

ps标识5种状态码
1. D不可中断
2. R运行
3. S中断
4. T停止
5. Z僵死

top
动态查看进程信息

lsof
列出当前系统打开文件的工具
-a 两个条件都满足
-c string COMMAND里包含string
-u username
-g gid GID
+d/D /DIR/ 该目录下打开的
-d FD 指定文件描述符
-n 不讲IP转换为hostname
-i 显示符合条件的进程情况

ifconfig
网络接口参数

route
路由参数

网络故障排错
1. ping
顺序: 本地回环、本地IP、网关IP、外网IP

2. traceroute
跟踪包转发

3. nslookup
查看DNS解析

4. dig
查询域名与IP地址之间的对应关系

5. netstat
查看端口情况

调试

系统调用

所有操作系统在内核都有一些内建的函数,用来完成一些系统级别的功能,称为系统调用,代表了用户空间到内核空间的一种转换。在用户空间调用open函数,在内核空间则会调用sys_open。
系统调用的错误码:系统调用并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中。如果一个系统调用失败,你可以读出errno的值来确定问题的所在。另外,在处理errno前最好先把它的值存入另一个变量,因为在错误处理过程中,即使像printf()这样的函数出错时也会改变errno的值。

strace

让开发者知道一个程序在后台所做事情

strace ./test.out

跟踪信号传递

strace时,能监测到系统对该程序发送的信号

统计系统调用

strace -c ./test.out
将进程所有的系统调用做一个统计分析并返回

统计每个系统调用花费的时间

strace -T ./test.out

跟踪现有进程

strace -p pid

gdb

编译时

1
2
gcc -g hello.c -o hello
g++ -g hello.cpp -o hello

启动gdb
1
2
3
4
5
1. gdb program
2. gdb program core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件
3. gdb program 1234
指定PID

指令
1
2
3
4
5
6
7
8
9
l 列出源码
Enter 重复上一条命令
b 15 在15行设置断点
r 运行
n 单步执行
p i 打印变量
bt 查看函数堆栈
finish 退出函数
q 结束调试

Valgrind

内存分析工具

Linux程序内存空间布局

高地址

命令行参数和环境变量
栈 stack
堆 heap
未初始化的数据段 .bss segment
未初始化的数据段 .data segment
代码段 .text segment

低地址

堆和栈的区别

  1. 申请方式不同
    栈:由系统自动分配
    堆:程序员自己申请,并指明大小

  2. 申请后的系统的响应不同
    栈:只要大于申请空间,否则栈溢出
    堆:链表实现,记录空闲地址

  3. 申请大小限制不同
    栈:向低地址扩展,连续的内存区域
    堆:向高地址扩展,不连续的内存区域,存在碎片

  4. 申请效率不同
    栈:快
    堆:慢

  5. 存储内容不同
    栈:函数调用时,首先进栈的是下一条指令的地址,之后是各个参数从右往左,之后是局部变量。静态变量不入栈。
    堆:头部用一个字节存放堆的大小

内存错误种类

  1. 使用未初始化的内存
  2. 内存读写越界
  3. 内存覆盖
  4. 动态内存管理错误
    1.申请和释放不一致
    2.申请和释放不匹配
    3.释放后仍然读写

  5. 内存泄漏

RAID磁盘阵列

RAID 0

不含校验与冗余的条带存储

RAID 1

不含校验的镜像存储,磁盘利用率最低

RAID 2

位级别的校验式条带存储,使用海明码,至少三块,有一个校验盘。

RAID 3

字节级别的校验式条带存储

RAID 4

数据块级别的校验式条带存储

RAID 5

数据块级别的分布式校验条带存储,海明码被写入不同的磁盘

RAID 10

镜像与条带存储,RAID 0与RAID 1结合

Vim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
gg 移动到首行
G 移动到末尾
nG n为行数,移动到第n行
fx 移动到下一个x字符
Fx 移动到上一个x字符
ndd 删除n行
d$ 删除当前至行尾
u 撤销上一步操作
yy 复制当前行
p 粘贴当前之后
P 粘贴当前之前

:s/root/admin/ 将当前行第一个出现的root替换为admin
:s/root/admin/g 将当前行所有root替换为admin
:3,5 s/sbin/bin/g 将3到5行所有sbin替换为bin
: % s/sbin/bin/g 所有行

! 执行shell命令

Shell

后台作业

1
2
3
4
5
6
7
8
命令 &
放后台运行

jobs
查看后台作业

fg n
从后台拉取序号n的作业到前台来

变量

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
NAME=tomcat
echo $NAME

typeset -r NAME
设置只读属性

declare INT_NUMBER
定义变量不赋值

typeset -i INT_NUMBER
设置int整数变量

read INT_NUMBER
从标准输入中读取值并且赋值

unset INT_NUMBER
删除变量

export NAME[=value]
定义环境变量或者将变量提升为环境变量

位置变量
$0 文件名
$1 第一个参数
$# 参数个数
$* 所有参数,看成一个整体
$@ 所有参数,每个看成一个整体
$$ 当前进程的ID号码
$? 退出代码

变量展开替换
${varname:-word} 否则返回word
${varname:=word} 否则设置为word
${varname:?message} 否则显示varname:message
${varname:+word} 如varname存在且非null,则返回word;否则返回null
${variable#key} 从头删除关键词,最短匹配
${variable##key} 从头删除关键词,最长匹配
${variable%key} 从尾删除关键词,最短匹配
${variable%%key} 从尾删除关键词,最长匹配
${variable/old/new} 替换第一个
%{variable//old/new} 替换所有

定义数组
name[subscript]=value
name=(value1 value2 value3)

索引数组
${name[*]}
${name[@]}
所有成员

${#name[subscript]}
${#name[*]}
${#name[@]}
返回长度/个数

算术运算
$((x+y))
expr arg1 + arg2

判断
-e FILE 文件是否存在
-d FILE FILE是否存在且为目录
-f FILE FILE是否存在且为普通文件
-w FILE 文件是否存在且可写
-s FILE 文件是否存在且非空
-r FILE 文件是否存在且可读
-x FILE 文件是否存在且可执行
-h FILE 文件是否为链接文件

-n STRING 字符串长度非0
-z STRING 字符串长度为0

INT1 -eq INT2 相等
INT1 -gt INT2 大于
INT1 -lt INT2 小于
INT1 -ge INT2 大于或等于
INT1 -le INT2 小于或等于
INT1 -ne INT2 不等于

echo '$HOME'
$HOME
echo "$HOME"
/root
echo "\$HOME"
$HOME

运行命令
echo `shell命令`
$(shell命令)

运行脚本三种方式:
chmod a+x print.sh
/root/print.sh

bash print.sh
sh print.sh

source print.sh
. print.sh

正则

1
2
[^] 对括号中的集合取反
\n 通过\1到\9调用()里的内容

sed

1
2
3
4
sed '2a TYPE=Ethernet' test.txt 第二行后追加......
sed '3i TYPE=Ethernet' test.txt 第三行前追加......
sed 's/yes/no/g' test.txt 所有yes替换no
sed '3,4d' test.txt 删除第3,4行

awk

1
2
3
4
5
awk '{print $1}' 输出第一列
awk '{print $0}' 输出该行
awk '{print NF}' 输出字段个数
awk '{print $NF}' 输出最后一列
-F 指定分隔符

if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if 条件
then
命令
fi

if 条件
then
命令
elif 条件
then
命令
else
命令
fi

case

1
2
3
4
5
6
7
8
9
case $变量 in
模式1)
命令序列
;;
模式2|模式3)
命令序列
;;
*)
esac

for

1
2
3
4
5
6
7
8
9
for 变量 in 值1 值2
do
命令
done

for ((i=0;i<=n;i++))
do
命令
done

while

1
2
3
4
5
6
7
8
9
while [条件]
do
命令
done

while read -r line
do
命令
done < file
一分一毛,也是心意。