linux - 三剑客
一、grep
https://www.gnu.org/software/grep/manual/grep.html
grep 是基于正则表达式查找满足条件的行,
核心意思是正则表达式及打印结果,主要内容在于 查找
内容检索
获取行 grep pattren file
* grep a file 打印file文件中出所有包含a的行
* grep "1$" file 过滤出内容为1 并且1为最后一个字符 的行
获取内容 grep -o pattern file
grep -o "[0-9]*1$" file 过滤出自己想要的数据,不会再打印出整行的内容
* 获取上下文 grep -A -B -C pattern file
* -A
* -B before 取前面的一行
文件检索
- 递归搜索(对一个目录进行递归检索) grep pattern -r dir/ 会展示dir文件下所有的子文件
- 展示匹配文件名 grep -H 111 /tmp/1
- 只展示匹配文件名 grep -l 111 /tmp/1
范围的约束
基于文件搜索和基于内容搜索,对条件进行以下约束:
- 忽略大小写 grep -i pattren filer
- 不显示匹配的行 grep -v pattern file
- 使用扩展正则表达式 grep -E pattern file
- 文件范围和目录范围约束 grep 111 -r /tmp/ --include "11*"
进程检索
进程过滤场景比较特殊,需要注意
grep本身会开启新的进程,所有需要单独过滤掉grep进程
- 一般情况下我们使用 ps -ef | grep ssh 对进程进出检索,但是此方法会有一个问题:ps 和 grep 会同时被执行,就会产生两个(多余)进程,此时在做数据处理的时候会容易出现问题
- 在做进程检索的时候,把带有grep的进程过滤掉,防止处理数据时误判
- grep -ef | grep ssh | grep -v grep
grep 相对简单,一般多与管道结合使用
- grep -ef | grep ssh | grep -v grep
二、awk
http://www.gnu.org/software/gawk/manual/gawk.html
根据定位到的数据行处理其中的分段,三剑客中最核心、能力最强大
- awk的基本语法
- awk是linux下的一个命令,同时也是一种语言结束引擎
- awk具备完整的变成特性,比如执行命令,网络请求等
- 语法 awk 'pattern{action}' (匹配表达式{行为表达式}):给定一个pattern表达式,然后对匹配到行、行数进行数据处理
awk上下文变量
BEGIN 开始 END 结束
NR 行数
$1 $2...$NF NF 字段与字段数
$0 整行
FS 代表字段之间使用什么符号进行分隔
OFS 输出数据的字段和分隔符
RS 记录分隔符
ORS 输出字段的行分隔符
字段变量
-F 参数 指定字段分隔符,可以用 | 指定多个 - 分隔符 -F'<|>'
BEGIN{FS="_"} 也可以表示分隔符
$0 表示当前的记录
$1 表示第一个字段
$N 代表第N个字段
$NF 代表最后一个字段
$(NF-) 表示倒数第二个字段
pattern表达式
* 正则表达式 $1~/pattern/ /pattern
* 比较表达式 $2>2 $1=="b"
awk patttern 匹配表达式案例
开始和结束
awk 'BEGIN{}END{}'
正则匹配
整行匹配:awk '/Running/'
字段匹配:awk '$2~/xxx/'
行数表达式
取第二行:awk 'NR==2'
去掉第一行:awk 'NR>1'
区间选择(, 号隔开)
awk '/aa/,/bb/' 当出现aa时开始记录,遇见bb时,结束记录
awk '/1/,NR==2' 当出现1时记录,直到第二行结束
action表达式(紧跟pattern)
打印 {print $0} {print $2}
赋值 {$1="abc"}
处理函数
原始内容
更新后内容 {$1=$1;print $0}
单行转多行
开始的时候使用BEGIN=RS(记录分隔) : 为分隔符 将里边的数据拆分成多行并打印 一条记录默认换行
多行变成单行
1 - 将记录分割RS置空,意味着所有的字符将变成单个字段
2 - FS="\n":代表字段之间使用了换行(\n)来分隔
3 - OFS=":":输出的时候以:作为分隔字符
计算平均数
- BEGIN{total=0;FS=","}:开始时定义一个变量total,并以 , 为分隔符
- {total+=$2}: 没有pattern表达式,意味着每一行都要执行此表达式,即 累加$2(第二个)字段
- END 当所有数据处理完成之后才往下执行
- {print total/NR}:打印输出 累加之后的total除以NR(总的记录数/行数)
awk的词典结构 array
...
三、sed
https://www.gnu.org/software/sed/manual/sed.html
sed为流式编辑器,主要用于定位和修改数据、偏重于对数据的编辑
vim 1 的内容
sed基本语法与常见参数
语法结构:sed [addr]X[options]
* -e 表达式
* sed -n '2p' 打印第二行
* sed 's#hello#world' 修改(替换表达式)
* -i 直接修改源文件
* -E 扩展表达式
* -debug 调试
sed pattern 表达式
- 行数与行数范围1 3,5
-
20 代表20行 30,35代表30行到35行
案例:
-
正则表达式:/pattern/
-
区间表达式://,//
-
sed action (sed的重头戏)
测试工程师用到的最多的,p打印 s查找替换 其他的基本用不到,所有这里仅记录以下三种方法,更多可以查看官网用法
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#'
s表达式
* s表示替换
* 后面的追加字符可以修改为任意字符:s/a/b/-->s#a#b#
g 表示全局匹配
& 表示内容匹配
本文来自博客园,作者:稀饭配菜根,转载请注明原文链接:https://www.cnblogs.com/zwnong/p/15811515.html