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
2
top
ps -ef

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
2
3
4
5
6
7
8
9
-  FS(Field Separator):输入字段分隔符, 默认为空白字符
- OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
- RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
- ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
- NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
- NR(Number of Record):行号,当前处理的文本行的行号。
- FNR:各文件分别计数的行号
- ARGC:命令行参数的个数
- ARGV:数组,保存的是命令行所给定的各参数

使用:打印首行

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

作者

Desirer

发布于

2023-12-22

更新于

2024-06-05

许可协议