命令 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
启动gdb1 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.释放后仍然读写
内存泄漏
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