【Linux】Linux文本处理-grep、awk、sed

文章目录


grep、awk、sed是Linux的三个文本操作指令。grep侧重单纯的查找与筛选,awk侧重格式化文本,sed侧重编辑匹配到的文本。

1、grep

Global Regular Expression Print,表示全局正则表达式。

  • 语法
grep [参数] 样式 文件
  • 参数
参数含义
-A后跟数字,除了符合样式的一行,并显示该行下面的n行
-B后跟数字,除了符合样式的一行,并显示该行上面的n行
-C后跟数字,除了符合样式的一行,并显示该行上下的n行
-c返回匹配的行数
-e实现逻辑or
-E匹配多个样式,与-e相似
-f后跟文件名,即把文件内容作为要匹配的样式
-F将样式视为固定字符串
-i忽略大小写
-n显示匹配行的行号
-o仅返回匹配到的字符串,而不是整行
-q静默,不输出任何信息,用于脚本中
-v反选
-w匹配整个单词,而不是包含样式字符串就行
  • 用法举例

经典用法---管道后的筛选

//用于管道后的筛选

ps -ef |grep -i redis
kubectl get po -A|grep -vi run

单独执行---查找匹配

//参数用法举例

> cat 1.txt
aaaaaa
bbbbbb
--------------------------------------
//-e与-E
> grep -e aa -e bb 1.txt
aaaaaa
bbbbbb
> grep -E "aa|bb" 1.txt
aaaaaa
bbbbbb

--------------------------------------
//有-F,aa*是一个固定字符串,而非匹配
> grep 'aa*' 1.txt
aaaaaa
> grep -F 'aa*' 1.txt
//空

> grep -f file.txt 1.txt  //file.txt内容为a
aaaaaa
--------------------------------------
//-w匹配整个单词
> grep aaa 1.txt
aaaaaa
> grep -w aaa 1.txt
//空


2、awk

awk,即awk指令的三个作者的Family Name 的首字符。

  • 语法
    awk [参数] ‘script’ var=value file
    awk [参数] -f scriptfile var=value file
    精髓是:awk '{/条件/ 动作}' 文件名

  • 参数

参数含义
-F指定分隔符,默认是空格,如-F:
-v定义一个变量,如-v a=1
-f后跟脚本名,从脚本文件中读取awk指令
  • 用法举例
//测试文件
> cat 1.txt
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo

**用法1:格式化输出

> awk '{print $1,$4}' 1.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
每行按空格或TAB分割,输出文本中的1、4列

**用法2:-F指定分隔符

-F和使用内建变量FS的等价写法
> awk -F, '{print $1,$2}'   1.txt
> awk 'BEGIN{FS=","} {print $1,$2}'     1.txt

指定多个分隔符
> awk -F '[ ,]'  '{print $1,$2,$5}'   1.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple
 -F '[ ,]'即先用空格分隔,对分隔结果在用逗号分隔

**用法3:awk -v设置变量

> awk -va=1 '{print $1,$1+a}' 1.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 

//注意二者的区别,下面这个是输出第一列和第1+a列
> awk -va=1 '{print $1,$(1+a)}' 1.txt

**用法4:从awk脚本中取awk指令

awk -f {awk脚本} {文件名}

> awk -f deploy.awk 1.txt

**用法5:正则表达式匹配

1>匹配有re的行,并打印全行,以下三种写法等价
---------------------------------
awk '/re/' 1.txt
awk '/re/ {print}' 1.txt
awk '/re/ {print $0}' 1.txt

2>匹配有re的行,打印第二列和第四列
--------------------------------- 
awk '/re/ {print $2,$4}' 1.txt

3>匹配第二列有re的行,打印第二列和第四列
---------------------------------
awk '$2 ~ /re/ {print $2,$4}' 1.txt

4> 匹配严格以This开头的行
awk '/^This/' 1.txt

**用法6:取反

awk '!/th/ {print}' 1.txt
awk '$2 !~ /th/ {print $2,$4}' 1.txt

**用法7:忽略大小写

awk 'BEGIN{IGNORECASE=1} /this/' 1.txt
---------------------------------------------
2 this is a test
This's a test

在这里插入图片描述

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

有关awk的常用组合指令:

#打印出网卡名和IP
ip a|awk '/glo/ {print $NF ":\n" $2}'
/glo/是去匹配包含glo字样的行,因为有配置IP地址的网口,必定IP的那一行是会有global字样的。最后一列是网卡名,第二列是IP地址。

#K8s相关
kubectl logs -f $(kubectl get po -A|awk ‘/pod-xxx/{print $2}’) -n namespace
kubectl delete pod ${kubectl get -A|awk ‘/pending/{print $2}’) -n namespace



3、sed

依照脚本处理文件。

  • 语法
    sed [-e script语句] [-f script文件] [文本文件]

  • 参数
    -e:说明用脚本语句处理文件
    -f:说明用脚本文件处理文件

动作符号含义
a新增,后跟字符串,新字符串在指定行的下一行
c取代
d删除
i插入,后跟字符串,新字符串在指定行的上一行
p打印
s取代
  • 用法举例
//测试文件

>cat testfile
Hello world
Java
Extends
PHP
Testfile
This is a testfile
9527
// a新增
sed 行号a\新加内容 文件名

> sed -e 1a\aTestAdd testfile

结果:
在这里插入图片描述

// d删除

//删除第2-4行,没加-i,不改原文件
> sed '2,4d' testfile

结果:
在这里插入图片描述

  • 经典用法–查找与替换

sed 's/要被取代的字串/新的字串/g'

sed -i 's/9527/code-9527/g' testfile

在这里插入图片描述

同样的注意,不加-i,只是输出到控制台的被修改了,实际文件没变

在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-代号9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值