Linux 三剑客学习使用

351 阅读4分钟

Linux 三剑客学习使用

工具特点使用场景
grep过滤过滤速度快
sed替换,修改文件内容,取行文件修改,或取出某个范围的内容
awk取列,统计计算取列,比较,统计计算

grep

常用命令

参数含义备注
-E相当于 egrep 命令 支持扩展正则
-ccount 统计行数
-v取反 排除
-n显示行号
-i过滤时忽略大小写
-w精确匹配
-Aafter -An 显示匹配成功后的 n行了解
-Bbefore -Bn 显示匹配成功前的 n行了解
-Ccontent -Cn 显示匹配成功前后的 n行了解

sed

选项解释
-n仅显示script处理后的结果

功能

功能
ssub 替换 "s#string1#string2#g" 改
pprint 输出 查
ddelete 删除 删
c/a/iinsert 插入 增

执行过程

找谁 干啥

找谁:目标行

干啥:操作

  • 如果想对文件操作,需要使用 -i 参数

image-20220125112714719

sed 查找(查)

格式作用修饰符
"np"指定行号(n)过滤p
"n,mp"指定行号范围[n,m]过滤p
"/string/p"过滤某字符(string) 可以使用正则表达式p
"/10:00/,/11:00/p"过滤从10点开始11点结束的内容(过滤日志常用)p
"n,/string/p"混合使用 从第n行开始,到出现string的行结束p

注意:

  • 需要使用 -n 参数,否则默认输出会输出所有的行

  • 使用扩展正则需要加 -r 参数

  • 在进行范围过滤时,如果结束匹配不到,就会一直找到最后一行

sed 删除(删)

格式作用修饰符
"nd"指定行号(n)删除d
"n,md"指定行号范围[n,m] 删除d
"/string/d"删除 某字符(string)所在的行 可以使用正则表达式d
"/10:00/,/11:00/d"删除 从10点开始11点结束的内容(过滤日志常用)d
"n,/string/d"混合使用 从第n行开始,到出现string的行结束d

用法与查找类似

  • 不需要使用 -n 参数

  • 常用 "nd" "n,md"

sed 新增(增)

格式作用修饰符
"na string"append 追加 在第n行后追加内容stringa
"nc string"replace 替换 用string替换第n行c
"ni string"insert 插入 在第n行前插入内容stringi

增删改查的查找部分类似

如 "n,mp" "n,md" "n,ma" "n,ms"

sed 替换(改)

格式作用修饰符
"s/stringa/stringb/g"sub 替换 将所有的 stringa 替换为 stringbs
表示行内全面替换。g

其中 / 是分界符,可以使用 :@ # 等

  • "s/stringa//g" 这个用法可以使stringa替换为空,达成删除的效果

后向引用(反向引用)[扩展正则]

先保护再使用

image-20220125164030359

总结

image-20220126141021069

awk

执行过程

image-20220126141749339

内置变量

变量解释用法
NRnumber of record 指定行号( == != < <= > >= )(NR==1) | (NR >= 1 && NR <= 5)
NFnumber of field 每行的列数$NF 最后一列
FSfield separator 字段分隔符 相当于 -F ,-F: === -v FS=:字段分隔符
OFSoutput field separator输出字段分隔符
/string/过滤 string 所在的行
/string1/,/string2/从 string1 所在的行开始到 string2所在的行

行与列

备注
record 记录每一行默认以换行结尾
field 字段|域每一列默认以空格和制表

使用内置变量 NR 按行过滤

使用 -F指定列的分隔符

使用 $n 取出第n列数据

练习:

  • 取出网卡IP地址

image-20220127140536702

  • 解析nginx日志,得到返回状态不是200的请求信息(状态码 IP 请求类型 请求url )

image-20220127142928528

awk 模式匹配

正则的使用

  • 使用 ~// 使用正则表达式

image-20220127144939289

wanqq@DESKTOP-QL4SAK6:/mnt/d/study/nginx/logs/parsing-record$ cat access.log | awk -F" +" 'BEGIN{print "状态码 IP 请求类型 请求url"} NR < 20 && ($9~/[^23][0-9]{2}/) {print $9,$1,$6,$7}' | sed 's#"##' | column -t
状态码  IP          请求类型  请求url
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /
404     172.17.0.1  GET       /pushParsingXMLTask
404     172.17.0.1  GET       /pushParsingXMLTask
404     172.17.0.1  GET       /pushParsingXMLTask
500     172.17.0.1  GET       /index/loadFiles/path/app()-%3EgetRootPath().%22public/static/recordXML/%22
404     172.17.0.1  GET       /index/loadFiles/path/app()-%3EgetRootPath().%22public/static/recordXML/%22

image-20220127145539934

  • 使用 //,// 来限制范围
wanqq@DESKTOP-QL4SAK6:/mnt/d/study/nginx/logs/parsing-record$ head -10 access.log
172.17.0.1 - - [06/Jan/2022:02:11:57 +0000] "GET / HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:11:58 +0000] "GET / HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:13:05 +0000] "GET / HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:13:06 +0000] "GET / HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:16:14 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:16:14 +0000] "GET /favicon.ico HTTP/1.1" 200 1150 "http://localhost:8004/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:17:38 +0000] "GET /pushParsingXMLTask HTTP/1.1" 404 6858 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:18:10 +0000] "GET /pushParsingXMLTask HTTP/1.1" 404 6858 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:18:18 +0000] "GET /pushParsingXMLTask HTTP/1.1" 404 62810 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
172.17.0.1 - - [06/Jan/2022:02:18:31 +0000] "GET /index/pushParsingXMLTask HTTP/1.1" 200 16941 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
wanqq@DESKTOP-QL4SAK6:/mnt/d/study/nginx/logs/parsing-record$ cat access.log | awk -F" +" 'BEGIN{print "状态码 IP 请求类型 请求url"} /\[06\/Jan\/2022:02:11:57 \+0000\]/,/02:13:06/ && ($9~/[^23][0-9]{2}/) {print $9,$1,$6,$7}' | sed 's#"##' | column -t
状态码  IP          请求类型  请求url
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /
500     172.17.0.1  GET       /

image-20220127150737776

  • 特殊模式

模式应用场景
BEGIN在 awk 读取文件之前执行1 简单的统计计算,不涉及读取文件
2 在处理文件之前添加表头
3 创建变量(不如 -v)
END=在 awk 读取文件之后执行1 在awk统计时 先计算 后在 END 输出结果  使用数组,输出数组的结果
  • END 统计计算

  • 统计方法 ++(计数) += (求和)