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 会同时被执行,就会产生两个(多余)进程,此时在做数据处理的时候会容易出现问题
    image
  • 在做进程检索的时候,把带有grep的进程过滤掉,防止处理数据时误判
    • grep -ef | grep ssh | grep -v grep
      image
      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}
单行转多行

image
开始的时候使用BEGIN=RS(记录分隔) : 为分隔符 将里边的数据拆分成多行并打印 一条记录默认换行

多行变成单行

image
1 - 将记录分割RS置空,意味着所有的字符将变成单个字段
2 - FS="\n":代表字段之间使用了换行(\n)来分隔
3 - OFS=":":输出的时候以:作为分隔字符

计算平均数

image

  • 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 的内容
image

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行
      案例:
      image

    • 正则表达式:/pattern/
      image

    • 区间表达式://,//
      image

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 表示全局匹配
& 表示内容匹配
posted @ 2022-01-16 22:24  稀饭配菜根  阅读(88)  评论(0编辑  收藏  举报