目录:
- Linux 三剑客之 grep
- linux三剑客之awk
- linux三剑客之sed
- linux三剑客与管道使用
- 【实战】三剑客实战之nginx日志分析实战
- 【实战】三剑客实战之性能、网络统计实战
- linux进阶命令
- linux环境配置
- Linux与Bash编程实战
1.Linux 三剑客之 grep
内容检索:(注意:pattern
是模式参数,可以是一个正则表达式或简单的文本匹配。)
获取行 grep pattern file:(
这个命令用于在文件中搜索匹配给定模式(pattern)的行。模式可以是正则表达式或简单的文本匹配。该命令返回所有匹配的行,不进行任何排序或过滤。)
获取内容 grep -o pattern file (
这个命令与上一个命令类似,但它只返回匹配模式的行,而不是整个行。这意味着它会返回匹配模式的文本行,而不是包含这些文本的行。)
获取上下文 grep -A -B -C pattern file(
将返回匹配模式的行,并显示匹配行的前2行和后3行,以及匹配行的上下文(即匹配行的前1行和后1行)。
-C:理解-C参数 ,返回匹配行的前2行,后俩行
文件检索:
递归搜索 grep pattern -r dir/
展示匹配文件名 grep -H pattern file
只展示匹配文件名 grep -l pattern file
范围约束:
忽略大小写 grep -i pattern file
不显示匹配的行 grep -v pattern file
使用扩展正则表达式 grep -E pattern file
文件范围和目录范围约束 grep 111 -r /tmp/demo/ --include "11*"(
这个命令将搜索 /tmp/demo/
目录及其子目录中以 111
开头的文件,并输出包含文本 111
的行。)
进程检索:
进程过滤场景比较特殊,需要注意 grep 本身会开启新进程,所以需要单独过滤掉 grep 进程
ps -ef | grep ssh
ps -ef | grep ssh | grep -v grep
2.linux三剑客之awk
awk简介:
awk是一个强大的文本处理工具,它可以用于处理各种类型的文本数据,包括文件、管道、标准输入等。awk命令可以对文本进行逐行处理,并且可以根据指定的规则对文本进行格式化和输出。
awk命令的主要功能包括:
- 逐行处理文本:awk命令可以从文件或标准输入中读取文本,并对每一行进行处理。可以使用awk命令对每一行进行操作,例如查找、替换、删除等。
- 数据格式化:awk命令可以对文本进行格式化输出,例如按照指定的格式对文本进行分行、缩进、对齐等。
- 变量和条件语句:awk命令可以使用变量和条件语句来控制处理流程,例如根据指定的条件对文本进行过滤、选择、排序等操作。
- 函数和宏:awk命令可以使用自定义函数和宏来扩展其功能,例如定义自定义函数来处理特定的文本操作。
awk命令通常与其他命令和工具结合使用,例如cat、find、ls等,以便更有效地处理大规模的文本数据。awk命令可以用于各种应用程序,包括数据处理、数据分析、文件格式转换、文本解析等。
awk 基本语法:
- awk 是 linux 下的一个命令,同时也是一种语言解析引擎
- awk 具备完整的编程特性。比如执行命令,网络请求等
- 精通 awk,是一个 linux 工作者的必备技能
- 语法
awk 'pattern{action}'
awk 上下文变量:
- 开始 BEGIN 结束 END
- 行数 NR
- 字段与字段数 $1 $2 .. $NF NF
- 整行 $0
- 字段分隔符 FS
- 输出数据的字段分隔符 OFS
- 记录分隔符 RS
- 输出字段的行分隔符 ORS
字段变量用法:
- -F 参数指定字段分隔符,可以用|指定多个- 多分隔符 -F ‘<|>’
- BEGIN{FS=“_”} 也可以表示分隔符
- $0 代表当前的记录
- $1 代表第一个字段
- $N 代表第 N 个字段
- $NF 代表最后一个字段
- $(NF-1) 代表倒数第二个字段
pattern 表达式:
- 正则匹配
$1~/pattern/
/pattern/
- 比较表达式
$2>2
$1=="b"
awk pattern 匹配表达式案例:
- 开始和结束
awk 'BEGIN{}END{}'
- 正则匹配
- 整行匹配
awk '/Running/'
- 字段匹配
awk '$2~/xxx/'
- 整行匹配
- 行数表达式
- 取第二行
awk 'NR==2'
- 去掉第一行
awk 'NR>1'
- 取第二行
- 区间选择
awk '/aa/,/bb/'
awk '/1/,NR==2'
action 行为表达式 {action}:
- 打印
{print $0}
{print $2}
- 赋值
{$1="abc"}
- 处理函数
- 原始内容 $0
- 更新后内容
{$1=$1;print $0}
单行转多行:
echo 1:2:3 | awk 'BEGIN{RS=":"}{print $0}'
多行变单行:
echo '1
2
3' | awk 'BEGIN{RS="";FS="\n";OFS=":"}{$1=$1;print $0}'
计算平均数:
echo '1,10
2,20
3,30' | awk 'BEGIN{total=0;FS=","}{total+=$2}END{print total/NR}'
awk 的词典结构 array:
- array 是稀疏矩阵,类似 python 的词典类型
- 统计多家机构的营业额
- 统计多家机构的营业额平均值
统计多家机构的营业额
echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7' | awk '{data[$1]+=$3}
END{for(k in data) print k,data[k]}'
统计多家机构的营业额平均值
echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7' | awk '{data[$1]+=$3;count[$1]+=1;}
END{for(k in data) print k,data[k]/count[k]}'
The GNU Awk User’s Guide
sed, a stream editor
GNU Grep 3.11
3.linux三剑客之sed
sed命令可以读取文本文件,并使用一系列指令对文本进行修改、删除、插入、替换等操作。sed命令通常用于处理文本数据,例如查找、替换、格式化、排序等。
sed 基本语法与常用参数
- 语法结构 sed [addr]X[options]
- -e 表达式
- sed -n ‘2p’ 打印第二行
- sed ‘s#hello#world#’ 修改
- -i 直接修改源文件
- -E 扩展表达式
- –debug 调试
sed pattern 表达式
- 行数与行数范围 20 30,35
- 正则匹配 /pattern/
- 区间匹配 //,//
sed action 表达式
- p 打印,通畅结合-n 参数:sed -n ‘2p’
- s 查找替换:s/REGEXP/REPLACEMENT/[FLAGS]
- d 删除,删除前两行 sed ‘1,2d’
- a 追加
- c 改变
- i 插入内容到匹配行之前
- e 执行命令
- 分组匹配与字段提取:sed ‘s#([0-9])|([a-z])#\1 \2#’
行数操作
- 打印特定行
sed -n 2p
- 删除最后一行
sed $d
s 表达式
- s 表示替换
- s 后面的追加字符可以为任意字符
- g 表示全局匹配
- & 表示匹配内容
echo a:b:c | sed 's/:/123&/'
a123:b:c
echo a:b:c | sed 's/:/&123/'
a:123b:c
echo a:b:c | sed 's#:#|#g'
a|b|c
反向引用
- 使用()对数据进行分组
- 使用\1 \2 反向引用分组
echo 0 1 2 3 4 | sed -E 's#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#'
0 3 2 1 4
Linux 三剑客实战
日志数据检索
找出 log 中的 404 500 的报错 考察严谨性
find_error_log() {
less nginx.log | grep -E '(" 404 |" 500)'
less nginx.log | grep '$9~/404|500/'
}
上下文检索
找出 500 错误时候的上下文 考察 grep 高级用法
日志数据统计
找出访问量最高的 ip 统计分析
数据文件修改
找出访问量最高的页面地址 借助于 sed 的统计分析
参考资料
- 高级 Bash 脚本编程指南
- LINUX 与 UNIX SHELL 编程指南
- 鸟哥的 Linux 私房菜
- Bash 官方文档
- 阮一峰的《bash 脚本教程》
4.linux三剑客与管道使用
程序运行环境输入与输出:
- 标准输入 0
read a;echo $a
- 标准输出 1
echo ceshiren.com
- 错误输出
ls not_exist_dir
管道重定向
- 管道与管道之间可以重定向
- 管道与文件之间可以重定向
echo 11 > /tmp/aaa.txt
read var </tmp/aaa.txt
echo $var
ls not_exist_dir > /tmp/aaa.txt
ls not_exist_dir > /tmp/aaa.txt 2>&1
管道连接符 |
- 管道连接符
|
可以连接多个程序的执行 - 管道连接是以子进程的方式启动的
echo myname | { read line; echo input is $line; }
管道执行的上下文控制
- 使用 { command; } 注意花括号与内部命令之间的空格与分号
- 使用控制逻辑 while read 组合
- 使用 $() ``
#这个方式无法获得变量x
echo hello world | read x;
echo $x
#如下两个方式可以获得变量x
echo hello world | { read x; echo $x; }
echo hello world | while read x; do echo $x;done
Linux 三剑客介绍
grep
global search regular expression(RE) and print out the line 基于正则表达式查找满足条件的行
awk
名字来源于三个作者的名字简称
根据定位到的数据行处理其中的分段
sed
stream editor
根据定位到的数据行修改数据>
与 SQL 的对比
Linux 三剑客 | SQL Structured Query Language |
---|---|
grep 数据查找定位 | select * from table like ‘%xx’ |
awk 数据切片 | select field from table |
sed 数据修改 | update table set field=new where field=old |
BRE 基本正则表达式
- ^ 开头 $结尾
[a-z]
[0-9]
区间,如果开头带有^表示不能匹配区间内的元素*
0 个或多个.
表示任意字符
ERE 扩展正则表达式
- 基本正则表达式(BRE)基础上的扩展
?
非贪婪匹配+
一个或者多个()
分组{}
范围约束|
匹配多个表达式的任何一个
5.【实战】三剑客实战之nginx日志分析实战网络统计实战
找出 log 中的 404 500 的报错 考察严谨性
less nginx.log | grep -E '(" 404 |" 500)'
less nginx.log | grep '$9~/404|500/'
找出访问量最高的ip,统计分析,取出top3的ip和数量,打印出来
less nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -3
6.【实战】三剑客实战之性能、网络统计实战
进程
- top
- ps
常用性能命令
统计一个进程的实时cpu数据需要用到哪个命令?
封装自己的ps命令:
ps_ex ()
{
ps -o uname,pid,ppid,thcount,ni,pri,psr,pcpu,pmem,rss,vsz,sz,start_time,time,comm,c,command,args "$@"
}
统计aliyundun的性能:
perf_get ()
{
top -b -d 1 -n 20 | grep --color=auto --line-buffered -i yundun$ | awk 'BEGIN{print "cpu","mem"}{cpu+=$9;mem+=$10;print $9,$10}END{print "";print cpu/NR,mem/NR}'
}
网络:
- netstat -tlnp
- netstat -tnp
网络命令:
统计连接网络链接情况 :
connection_summary() {
netstat -tn |
awk 'NR>2{print $4,$6}' |
awk -F: '{print $2}' |
sort | uniq -c | sort -nr |
awk '{print $2"\t"$3"\t"$1}'
}
7.linux进阶命令
GET:
-G:使用get请求
- d:指定请求数据
curl https://www.baidu.comcurl -G https://www.baidu.com
curl -X GET https://www.baidu.com
POST:
- d:指定post请求体
curl -d 'login=1234' https://www.baidu.comcurl -X POST https://www.baidu.com
Other:
保存响应内容
- curl -o tmp.html https://www.baidu.com
输出通信的整个过程
- curl -v https://www.baidu.com
不输出错误和进度信息
- curl -s https://www.baidu.com
jq:
一个 jq 程序是一个过滤器
它接受一个输入并产生一个输出
官网:jq
简单使用:
. 格式优化
echo '{"a":11,"b":12}' | jq '.'
常用方法 :
内容提取:
echo '{"foo": 42, "bar": "less interesting data"}' | jq .foo
从数组中提取单个数据:
echo '[{"a":1,"b":2},{"c":3,"d":4}]' | jq .[0]
从数组中提取所有数据:
echo '[{"a":1,"b":2},{"c":3,"d":4}]' | jq .[]
过滤多个值:
echo '[{"a":1 ,"b":2},{"c":3,"d":4}]' | jq .[0,1]
数据重组成数组:
echo '{"a":1,"b":2,"c":3,"d":4}' | jq '[.a,.b]'
数据重组成对象:
echo '{"a":1, "b":2,"c":3,"d":4}' | jq '{"tmp":.b}'
8.linux环境配置
应用安装
- 平台自带的 app store:
- yum @centos/redhat
- apt-get @ubuntu debian
- scoop winget @windows
- 特定平台版本管理工具 pyenv nvm
- 安装包安装 pkg dmg
- 源码编译安装 make ; make install
redhat/centos 平台示例
- yum search $package
- yum install $package
- yum remove $package
ubuntu/debian 平台
- apt-cache search $package
- apt-get install $package
- apt-get uninstall $package
开源镜像站
- 华为:https://mirrors.huaweicloud.com/
- 阿里云:https://developer.aliyun.com/mirror/
9.Linux与Bash编程实战
统计 /home
目录下不同用户的普通文件的总数是多少:
find /home -type f -printf "%u\n" | sort | uniq -c
统计 netstat -anp
状态为 LISTEN 和 CONNECT 的连接数量分别是多少:
netstat -anp | grep LISTEN | wc -l
netstat -anp | grep CONNECT | wc -l