为什么要整理这种?

只有能讲出来和写出来的东西才是自己的,此文章为 Linux 日常操作指南。 快捷操作 -> 装x必备

你说你懂 Linux,其实大家都懂点,连测试和前端可能都经常打点命令去压测或者部署测试什么的,那你如何证明你更熟悉,来用熟练的快捷操作让旁边观摩的人暗暗惊叹吧~

命令行光标移动指令

光标快速切换到行首尾
1
2
ctrl a  行首
ctrl e 行尾
删除至行尾 | 清除当前光标位置之前的一个单词
1
2
ctrl k  可以将当前光标位置之后的所有部分快速清除
ctrl w 可以清除当前光标位置之前的一个单词
删除此条命令行
1
ctrl u  可以直接将整行命令直接清除
左|右 移动一个单词
1
2
esc b  左移一个单词
esc f 右移一个单词

vim 常用记录

光标漫游
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
j  向下
k 向上
h 向左
l 向右

shift + 上下左右 光标快速移动

gg 快速到文件头
G 快速到文件尾

shift 4($) 快速到行尾
shift 6(^) 快速到行首

i 插入模式
o 在下一行插入
复制 / 剪切
1
2
3
4
5
6
7
yy  复制一行
3yy 复制三行
yw 复制光标开始的第一个单词
y$ 复制光标到行尾

x 剪切光标所在字符
3x 剪切光标所在处往后的三个字符
删除 / 粘贴
1
2
3
4
5
6
dd  删除一行
3dd 删除三行
dw 删除一个单词
df" 删除到出现的第一个双引号

p 粘贴
ctrl + v 块模式
1
2
3
4
5
# 举个例子
1. 按下 gg 到行首
2. 按 `ctrl+v` 进入可视化模式,然后按 G 到行尾
3. 按 `I` 进入插入模式,输入 #
4. 按两次 ecs 回到普通模式,每一行都会生效
命令行模式
1
2
3
4
5
6
# 在普通模式下,输入 : 即可进入

%s/$/sth/ 在行尾追加sth
%s/\^M//g 替换掉dos换行符,\^M使用ctrl+v + Enter即可输入
g/^\s*$/d 删除空行以及只有空格的行
%s/#.*//g 删除#之后的字符
查找字符串
1
2
3
4
5
# 在普通模式下,按下/直接进入查找

n 查找下一个匹配
N 查找上一个匹配
2n 查找下面第二个匹配
宏录制

一般不咋用,用上了还挺酷的,算是 vim 特有操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. 按下 gg 到行首
2. 按下 qa 进行宏录制,a 是我们起的一个标记名称
3. 按 I 进入插入模式,输入 list.add("
4. 按 ESC 进入普通模式,然后按 $ 跳到行尾, 按 a 输入 ")
5. 按 j 进入下一行,然后按 ^ 回到行首
6. 再次按下 q 结束宏录制
7. 输入 @a 触发宏测试一下录制效果
8. 输入 3@a 重复宏3次,也就是影响下面的3行

aaa
bbb
ccc
⬇️
list.add("aaa")
list.add("bbb")
list.add("ccc")
其他操作
1
2
3
4
5
6
r    替换字符
ggVG 全选
u 恢复更改
:e /tmp/a 在同一个编辑器内打开/tmp/a文件。同一个编辑器的缓冲区是剪贴板是共享的,可以方便在多个文件中复制

wq wqa q! qa! 保存退出和不保存退出,a 即为 all 的意思

sed 常用记录

常用替换模式(更高级的我很少用)
1
2
3
4
5
sed '/^txt/s/a/b/g' file
# /^txt/ 选择以 ^txt 开头的行 ,s是substitute意思,a 是要匹配的字符,b 是要替换成为的字符,g 为flag

# 示例(匹配 test.txt 文件中 config 字符的行,以及后面的三行,将a替换为b)
sed '/config/, +3 s/a/b/g' test.txt
示范例子
1
2
3
4
5
# 统计文件中有每个单词出现了多少次
sed 's/ /\n/g' file | sort | uniq -c

# 查找目录中的py文件,删掉所有行级注释,并创建.bak 的备份文件
find ./ -name "*.py" | xargs sed -i.bak '/^[ ]*#/d'

awk 常用记录

常用文本筛选功能 (比如做一些日志处理和统计)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
awk -F "," '/^a/' {print $1} file
# -F "," 参数
# '/^a/' 范围
# {print $1} 操作

# 举个例子1:采用awk统计netstat命令的一些网络状态
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
# 输出结果为:
State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146

# 例子2,跟例子1的效果其实一样的:
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n -k 1 -r
示范例子
1
2
3
4
5
# 外网连接数,根据ip分组
netstat -ant | awk '/^tcp/{print $4}' | awk -F: '!/^:/{print $1}' | sort | uniq -c

# 输出 nginx 日志的 ip 和每个 ip 的 pv,pv 最高的前10
awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10

Linux 运维一定要懂得命令

CPU
1
2
3
4
5
6
7
top 中的 wa 是指当CPU空闲且磁盘IO阻塞的时间占比。注意这里只统计磁盘IO,不包含网络IO
top 中的 us 是指用户空间占用CPU百分比

kill -15 系统级别杀死,告知需要关闭,让其自行停止并退出,当然有些进程会拒绝结束
kill -9 内核级别杀死,需要立即退出,强制杀死
kill -3 可以打印进程各个线程的堆栈信息,默认保存为 /proc/${pid}/cwd/antBuilderOutput.log
#注:如果 -Xrs JVM选择没有被使用,kill -3命令会被忽略,可以使用 jstack -l [java pid] > jstack.out 来达到一样的效果
内存

细心的朋友可能注意到,CPU和内存的信息,通过top等不同的命令显示的数值是一样的。

存储
网络

网络方面推荐安装体验一下kali Linux(有很多渗透工具,界面UI也很有安全【黑客】风格),上面的工具会让你 high 到极点。

上面资源的组合途径

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。只不过以文件系统的方式为访问系统内核数据的操作提供接口。系统的所有状态都逃不过它的火眼金睛。例如:

  • cat /proc/vmstat 看一下,是不是和vmstat命令的输出很像?
  • cat /proc/meminfo 是不是最全的内存信息
  • cat /proc/slabinfo 这不就是slabtop的信息么
  • cat /proc/devices 已经加载对设备们
  • cat /proc/loadavg load avg原来就躺在这里啊
  • cat /proc/stat 所有的CPU活动信息
  • ls /proc/$pid/fd 静静地躺着lsof的结果
以 java 应用为例:

在这里插入图片描述

举个例子:

怎么查看某个Java进程里面占用CPU最高的一个线程具体信息?

最后附上经典一图
在这里插入图片描述