一、Linux 三剑客之 grep
1、 内容检索
- 获取行(单行)
grep pattern file
- 获取内容
grep -o pattern file
- 获取上下文
grep -A -B -C pattern file
- -A(after)参数用来指定grep命令在匹配到的行后显示的上下文行数。
- -B(before)参数用来指定grep命令在匹配到的行前显示的上下文行数。
- -C(context)参数用来指定grep命令在匹配到的行前后显示的上下文行数。
# -A 2 参数表示在匹配到的行后显示2行上下文;
# -B 1 参数表示在匹配到的行前显示1行上下文;
# -C 3 参数表示在匹配到的行前后显示3行上下文
grep -A 2 -B 1 -C 3 'apple' fruits.txt
2、 文件检索
- 递归搜索
grep pattern -r dir/
- 展示匹配文件名
grep -H 111 /tmp/1
- 只展示匹配文件名
grep -l 111 /tmp/1
3、 范围约束
- 忽略大小写
grep -i pattern file
- 不显示匹配的行
grep -v pattern file
- 使用扩展正则表达式
grep -E pattern file
- 文件范围和目录范围约束
grep 111 -r /tmp/demo/ --include "11*"
4、 进程检索
- 进程过滤场景比较特殊,需要注意
- grep 本身会开启新进程,所以需要单独过滤掉 grep 进程
ps -ef | grep ssh(使用管道连接,两个命令ps、grep都会同时执行,两个进程都会启动,使用grep进行过滤,这个命令也在执行,它里面也有ssh,所以带有ssh的进程都被搜索出来了)
503 2507 1 0 29 821 ?? 0:00.08 /usr/bin/ssh-agent
503 50022 11154 0 8:11下午 ttys002 0:00.00 grep ssh
ps -ef | grep ssh | grep -v grep(通过 -v 过滤掉包含grep的进程)
503 2507 1 0 29 821 ?? 0:00.08 /usr/bin/ssh-agent
二、Linux三剑客之awk
1、 awk 基本语法
- awk 是 linux 下的一个命令,同时也是一种语言解析引擎
- awk 具备完整的编程特性。比如执行命令,网络请求等
- 精通 awk,是一个 linux 工作者的必备技能
- 语法
awk 'pattern{action}'
2、 awk 上下文变量
- 开始 BEGIN 结束 END
- 行数 NR
- 字段与字段数 $1 $2 … $NF NF
- 整行 $0
- 字段分隔符 FS
- 输出数据的字段分隔符 OFS
- 记录分隔符 RS
- 输出字段的行分隔符 ORS
3、 字段变量用法
- -F 参数指定字段分隔符,可以用|指定多个- 多分隔符 -F ‘<|>’
- BEGIN{FS=“_”} 也可以表示分隔符
- $0 代表当前的记录
- $1 代表第一个字段
- $N 代表第 N 个字段
- $NF 代表最后一个字段
- $(NF-1) 代表倒数第二个字段
4、 pattern 表达式
- 正则匹配
$1~/pattern/
/pattern/
- 比较表达式
$2>2
$1=="b"
5、 awk pattern 匹配表达式案例
- 开始和结束
awk 'BEGIN{}END{}'
- 正则匹配
- 整行匹配
awk '/Running/'
- 字段匹配
awk '$2~/xxx/'
- 行数表达式
- 取第二行
awk 'NR==2'
- 去掉第一行
awk 'NR>1'
- 区间选择
awk '/aa/,/bb/'
awk '/1/,NR==2'
6、 action 行为表达式 {action}
- 打印
{print $0}
{print $2}
- 赋值
{$1="abc"}
- 处理函数
- 原始内容 $0
- 更新后内容
{$1=$1;print $0}
7、 单行转多行
echo 1:2:3 | awk 'BEGIN{RS=":"}{print $0}'
(以:为分隔,RS为记录分隔,即从1开始出现了冒号就是一条记录,则有三条记录,{print $0}新的记录打印的时候默认以换行作为分隔符)
输出结果为:
1
2
3
8、 多行变单行
echo '1
2
3' | awk 'BEGIN{RS="";FS="\n";OFS=":"}{$1=$1;print $0}'
(记录分隔RS=""记录分隔清空,所有的记录都变为单个字段,字段分隔FS="\n"字段之间的分隔符,输出分隔OFS=":"输出时以:作为分隔)
输出结果为
1:2:3
echo '1
2
3' | awk 'BEGIN{ORS=":"}{$1=$1;print $0}'
(ORS=":"记录输出时将记录分隔符改为使用:分隔)
输出结果为:
1:2:3:
9、 计算平均数
echo '1,10
2,20
3,30' | awk 'BEGIN{total=0;FS=","}{total+=$2}END{print total/NR}'
(BEGIN在开始的时候;创建变量total=0,字段分隔FS=","则1是个字段,10是个字段;{total+=$2}没有pattern则表示所有行都执行,从第二个字段开始进行累加,END结束;{print total/NR},NR是总的记录数,即为3)
输出结果为:
20
10、 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]}'
( data[$1]+=$3 :将当前行的第三个字段的值加到 data[$1] 上,将第一个字段("a" 或 "b")作为索引,将值累加到相应索引的数组元素上;
END{for(k in data) print k,data[k]}:是awk命令的END程序块,在所有输入行处理完毕后执行。:
- for(k in data) 遍历 data 数组中的每个索引。
- print k,data[k] 用于输出遍历过程中的索引和该索引对应的值。)
输出结果为
a, 60
b, 18
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]}'
输出结果为:
a, 20
b, 6
三、Linux三剑客之sed
1、 sed 基本语法与常用参数
- 语法结构 sed [addr]X[options]
- -e 表达式
- sed -n ‘2p’ 打印第二行
- sed ‘s#hello#world#’ 修改
- -i 直接修改源文件
- -E 扩展表达式
- –debug 调试
2、 sed pattern 表达式
- 行数与行数范围 20 30,35
- 正则匹配 /pattern/
- 区间匹配 //,//
3、 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#’
4、 行数操作
- 打印特定行
sed -n 2p
- 删除最后一行
sed $d
5、 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
6、 反向引用
- 使用()对数据进行分组
- 使用\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