Linux命令学习
学习思路:
大类相关:系统资源查看、文件操作
命令基本知识,比如选项参数、输出情况
应用场景:针对特定需求写命令
你应该知道的linux技巧 https://coolshell.cn/articles/8883.html
文件管理
查看:
- ls
- head、tail
- less、more、cat
管理
- chmod、chown
系统资源管理
ps命名
a
: 显示终端上的所有进程,包括其他用户的进程。u
: 显示进程的详细用户/拥有者信息。x
: 显示没有控制终端的进程。p
: 显示进程的PID(进程ID)
查询指定名称的进程pid,cpu 占用率和 memory 使用率
1 | ps aux | grep example |
杀死指定pid进程
1 | kill process_pid |
查看cpu使用情况
1 | top |
top命令
top命令可以实时地展示系统当前的进程状态,它会不断更新,提供系统进程的动态信息。而ps命令则是系统在过去执行的进程的静态快照,它不能实时更新。
此外,top命令还具有交互性,允许用户输入控制命令,比如在top命令的模式下输入n5,就显示此时的5个最活跃的进程,top会持续运行直到用户按下“q”,退出top。
网络管理
查看端口占用
1 | lsof -i:8080 |
文本操作
grep查找,sed编辑,awk对数据分析并生成报告。
grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本。
grep
Grep能使用正则表达式搜索文本,并把匹配的行打印出来,全称是 Global Regular Expression Print,全局正则表达式打印。grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。
命令的基本格式:
1 | grep [option] pattern file |
常见参数:
-i
:忽略大小写进行匹配。-v
:反向查找,只打印不匹配的行。-n
:显示匹配行的行号。-r
:递归查找子目录中的文件。-l
:只打印匹配的文件名。
实际例子:
1、系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
1 | grep -n '2019-10-24 00:01:11' *.log |
2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 “pattern” 的行,并打印匹配行所在的文件名和行号:
1 | grep -r -n pattern dir/ |
awk
AWK是文本处理命令( pattern-directed scanning and processing language),名称取自三位创始人首字符。awk的大致逻辑是逐行读入文件,以空格为默认分隔符将每行切片,再对切开的部分再进行各种分析处理。
基本用法:
1 | awk '[pattern] {action}' {filenames} # 行匹配语句 awk '' 只能用单引号 |
pattern
是要匹配的模式,通常是基于正则表达式;action
是当模式匹配时要执行的动作;filename
是您要处理的文件名。
过滤
(1) 例子
提取第1列与第4列
1 | awk '{print $1, $4}' netstat.txt |
亦可格式化输出,格式化语义与C语言的printf语义一致
1 | awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.tx |
提取第3列为0且第6列为LISTEN的行的第1列信息
1 | awk '$3==0 && $6=="LISTEN"{print $1} ' netstat.txt |
取出文件中的第一万至两万行
1 | awk 'NR>=10000 && NR<=20000' <filename> |
(2)基本知识
比较运算符:!=, >, <, >=, <=, ==
内建变量
名称 | 作用 |
---|---|
$0 | 当前记录(这个变量中存放着整个行的内容) |
$1~$n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格或Tab |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 |
FNR | 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 |
RS | 输入的记录分隔符, 默认为换行符 |
OFS | 输出字段分隔符, 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
FILENAME | 当前输入文件的名字 |
1 | - FS(Field Separator):输入字段分隔符, 默认为空白字符 |
使用:打印首行
1 | awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%s %s\n",NR,$4}' netstat.txt |
指定分割符,利用短选项-F
1 | awk -F: '{print $1,$3,$6}' /etc/passwd |
统计脚本
awk其实是一门脚本语言,有自己的语法结构,变量定义、条件循环等流程控制。
参考:https://www.bookstack.cn/books/junmajinlong-awk
(1)BEGIN 与 END
BEGIN
:当awk
开始处理任何输入行之前,BEGIN
模式下的代码块会执行一次。
END
:当awk
处理完所有输入行后,END
模式被触发。
BEGIN 和 END都放在要执行的代码块之前。
(2)自定义变量与流程控制
自定义变量,统计文件中含有字符串 abc 的总行数
1 | awk '/abc/ {count++} END {print count}' filename.txt |
自定义变量,统计目录下所有的C文件,CPP文件和H文件的文件大小总和。
1 | ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}' |
自定义数组,统计各个connection状态的个数
1 | awk 'NR!=1 {a[$6]++;} END { for (i in a) print i ", " a[i]; }' netstat.txt |
自定义数组,统计每个用户的进程的占了多少内存
1 | ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' |
自定义数组,统计一个文件(IP TIME) 的每个IP出现次数,并按次数排序
1 | awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -k2 |
sed命令
sed全称(stream editor)流式编辑器,主要逻辑也是逐行匹配,编辑。玩sed主要还得熟练正则表达式。
sed最主要的场景就是匹配并替换。
// todo