Linux文本处理三剑客

文本处理三剑客

grep:过滤

sed:修改、替换

awk:截取

grep - 文本过滤

据某个匹配的字符串去查找内容,找到了,默认将整行输出到屏幕,支持正则表达式

例:过滤出ssh进程的详细信息
在这里插入图片描述

grep选项

-i – 不区分大小写 ignore-case
-n – 显示行号 line-number
-o – 仅匹配符合要求的字符 only-match
-A n – 同时显示符合条件行的下面n行 after
-B n – 同时显示符合条件行的上面n行 before
-C n – 同时显示符合条件行的上下n行 center,context
-v – 取反
-r – 递归查找
-f – 根据文件内容进行匹配
-E – 支持扩展正则表达式,grep -E相当于egrep

grep使用正则表达式

\b – 表示单词的边界
\s – 空白(spsce、enter、tab)
? – 表示1个或0个前面的字符
+ – 表示1个或多个前面的字符
* 表示0个或多个前面的字符
. – 单个任意字符
.* – 任意字符
^$ – 空行
[[:alpha:]] – 字母
[[:alnum:]] – 字母数字混排
[[:space:]] – 空白
() – 分组
{n} – 表示n个前面的字符
{n,m} – 表示n个到m个前面的字符
<abc> – 表示abc这个单词
\ – 转义字符
“(chen){2}” – chen这个单词连续出现两次

例:显示出passwd文件中以chen开头的行cat /etc/passwd|grep -E "^chen"

sed - 过滤、编辑文本

sed是脚本中修改文本或文本替换的最佳工具,是非交互式的
sed命令格式: sed [选项] '命令' 文件

前一个命令的输出也可以作为sed命令的输入:cat 文件|sed [选项] '命令'

sed选项

-n – 只显示匹配处理的行(否则会输出所有)
-e – 执行多个编辑命令时(每个-e后接一个命令,一般用;代替)
-i – 直接在文件中进行修改,而不是输出到屏幕
-r – 支持扩展正则表达式
-f – 将sed命令写入文件中,从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)

sed 查找方式:
1、根据行号
2、根据模式 --> 正则表达式 = 字符 + 特殊符号
3、根据字符串

sed两种空间

模式空间

模式空间是 sed 在处理文本时使用的临时存储区域。当 sed 读取一行文本时,该行会被保存到模式空间中,然后按照指定的命令对模式空间中的内容进行处理。模式空间中的内容可以使用不同的 sed 命令进行修改、替换和删除等操作。处理完毕后,模式空间中的内容可以通过 p 命令打印出来,或者通过 w 命令写入到文件中。

保持空间

保持空间是 sed 中的另一个临时存储区域,用于在不同的处理步骤之间保存数据。与模式空间不同,保持空间的内容在 sed 处理每一行时是持久的,不会被自动清除。保持空间的内容可以使用 h 命令从模式空间中复制过来,也可以使用 h 命令追加内容到保持空间中。通过 g 命令可以将保持空间的内容复制回模式空间,从而可以在处理过程中使用保持空间中的数据。

简单来说,模式空间是一行一行处理,处理完就删掉了
保持空间,是一个临时存放数据的缓冲区,一般用来协助模式空间进行数据处理
相关选项:
h – 把模式空间里的行拷贝到暂存空间(覆盖)
H – 把模式空间里的行追加到暂存空间
g – 用暂存空间的内容替换模式空间的行
G – 把暂存空间的内容追加到模式空间的行后
N – 追加下一行到当前模式空间之后
默认情况下保持空间是空的

多行文本合并成一行
[root@localhost lianxi]# sed 'H;$g;$s/\n/ /g;$!d' d.txt
 one two three
[root@localhost lianxi]# sed 'H;$g;$s/\n/ /g' d.txt
one
two
 one two three
$!d保留最后一行,其他行都删除

sed的常用编辑命令

p – 打印匹配行 print
d – 删除指定行 delete
a – 在匹配行后面追加 append
i – 在匹配行前面插入 insert
c – 整行替换
y – 逐个替换
r – 将文件的内容读入 read
w – 将文本写入文件 write
s – 字符串替换(匹配正则表达式)substitution
= – 输出行号
r – read filename 从filename里面读取,将filename里的内容放到匹配的行之后
N – 追加下一行到当前模式空间之后

sed [address] command
[address]是一个可选的地址或模式,用于指定要应用命令的行范围,command是要执行的sed命令

  1. 空地址 – 全文处理

  2. 单地址 – 7p

  3. 步进地址 – 1~2p 从第1行开始,步长为2

  4. 地址对:
    n,m – 从第n行到第m行
    n,+m – 从第n行开始向下匹配第m行
    n,/parttern/ – 从第行到pattern匹配的行 parttern支持正则表达式,使用//包裹起来
    /parttern1/,/parttern2/ – 从parttern1匹配到parttern2匹配的行

    $ – 最后一行
    ! – 表示取反
    , – 一般表示选定行的范围 – 1,3p 1到3行
    ; – 表示执行多个命令 – 1;3p 1和3行
    n – 读取下一行
    i\ insert – 在当前行的上面插入文本
    a\ append – 在当前行的后面插入文本
    n~m – 从第n行开始,每m行选择一行

打印奇数行
[root@localhost lianxi]# sed -n 'p;n' b.txt
[root@localhost lianxi]# sed -n '1~2p' b.txt
打印偶数行 
[root@localhost lianxi]# sed -n 'n;p' b.txt
[root@localhost lianxi]# sed -n '2~2p' b.txt

‘p;n’ 表示打印当前行,跳过下一行

sed的s命令示例(替换)
[address]s/parttern/replacement/flags
flags替换标记
g 表示行内全面替换
p 表示打印行
& 表示已匹配的字符串
n 表示数字 1-512 表示替换第几个
ng 表示从第几个开始替换

将1,2行的数字换成*
[root@localhost lianxi]# sed -r '1,2s/[0-9]/\*/g' b.txt
abc *** digit*
***************
xxx yyy digit 345

s 支持正则表达式,支持分组向后引用

替换为:捕获组1后接*
[root@localhost lianxi]# sed -r '1,2s/([0-9])/\1\*/g' b.txt
abc 1*2*3* digit2*
***************
xxx yyy digit 345
([0-9])是一个捕获组,\1 表示对捕获组的引用

sed的p命令示例
sed -n ‘行号1,行号2p’ 输入文件

sed -n '2,3p' /etc/passwd     显示2到3行
sed -n '10p' /etc/passwd      显示第10行
sed -n ‘$p’ /etc/passwd       显示最后1行
sed -n '2,+2p' /etc/passwd    显示234行 
sed -n ‘3,100!p’ /etc/passwd  显示1到2行

双引号里可以使用shell里的变量

[root@localhost lianxi]# a=1
[root@localhost lianxi]# b=3
[root@localhost lianxi]# cat -n b.txt|sed -n "${a}p;${b}p"
     1	abc 123 digit2
     3	xxx yyy digit 345

awk - 过滤、统计、截取

awk是一种编程语言,对文本、数据进行处理

内部编程和C语言有相同之处
与sed一样, 均是一行一行的读取、处理
但sed作用于一整行的处理, 而awk将一行分成数个字段来处理

awk表达式:awk [选项] 'awk命令脚本' file

常用命令选项

-F – 指定分隔符,默认空白符
-v – var=value 将外部变量传递给awk
-f – scripefile 从脚本文件中读取awk命令

awk命令脚本基本结构体(由三大块组成)

awk 'BEGIN{commands}pattern{commands}END{commands}' file
'BEGIN{语句块}/模式/{动作}END{语句块}'

BEGIN、模式通用语句块、END都是可选部分
BEGIN – 处理数据前执行的命令
pattern – 每行都执行的命令
END – 处理数据后执行的命令

执行顺序:
第一步:执行BEGIN语句块中的内容,在处理文本之前,读取行之前执行,一般用在初始化变量,打印表头
第二步:parttern语句块,通用语句块,读取文本的每一行交给这个语句块
第三步:读取完所有的行之后执行,(统计、分析结果)

[root@localhost lianxi]# awk 'BEGIN{print "start...";print "start2..."}{print}END{print "end..."}' 1.txt
start...
start2...
12345
end...

通用语句块 – 模式和动作

模式:
模式可以是正则表达式、条件表达式或两种组合/正则表达式/ :可以使用正则表达式匹配
关系表达式、运算符表达式 关系表达式 && || ! 组合条件
运算符条件 – 比较运算符 > < ==
模式匹配表达式:用运算符 ~ !~

动作:
动作是由一个或多个命令、表达式组成,命令之间用;分隔,可以是变量或数组的赋值、输出、使用内置函数、控制流语句

awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
如果模式是正则表达式要用/定界符
多个动作之间用;号分开

内部变量

$0 – 表示整行文本
$1 – 表示分隔出来的第一列文本
$2 – 表示分隔出来的第二列文本
$n – 表示分隔出来的第n列文本
NF – 每行$0的字段数(列数)
$NF – 最后一列
NR – 当前处理的行号
NR>1 – 表示跳过第一行
FS – 当前的输入分隔符,默认是空白字符(空格和tab)field separator
OFS – 当前的输出分隔符,默认是空格字符(空格)output field separator

[root@localhost lianxi]# cat aa.txt
aa:bb:cc
bb:cc
cc:gg
dd:ee ff
[root@localhost lianxi]# awk 'BEGIN{FS=":";OFS="**"}{print $1,$2}' aa.txt
aa**bb
bb**cc
cc**gg
dd**ee ff

awk用-F来指定分隔符
默认的字段分隔符是任意空白字符(空格或者TAB)

cut和awk:cut命令适用于简单的文本处理操作,而awk命令适用于更加复杂的文本处理和数据分析操作

awk流程控制

awk流程控制语法类似于shell

[root@localhost lianxi]# echo |awk 'BEGIN{num=100;if(num>90){print "大于90"}else if(num==90){print "等于90"}else{print "小于90"}}'
大于90

if(!(c not in t1))判断不存在

参数传递,awk接收外部变量三种方法:
1、使用双引号
2、使用-v选项
3、将变量的接收放后面

[root@localhost lianxi]# a=12
[root@localhost lianxi]# b=13
[root@localhost lianxi]# echo |awk "{print $a+$b}"
25 
[root@localhost lianxi]# echo |awk -v var1=$a var2=$b'{print var1+var2}'
25
[root@localhost lianxi]# echo |awk '{print var1+var2}' var1=$a var2=$b
25

awk数组的使用(分析、统计)

数组下标从1开始,k-v形式,类似于python中的字典
没有相应的key值也能取出相应的值为空

[root@localhost lianxi]# cat test1.txt 
xiaowang  class1 yuwen  90
xiaoming  class2 yuwen  88
xiaoli    class1 yuwen  87
xiaoming  class2 shuxue 100
xiaowang  class1 shuxue 99
xiaohuang class2 shuxue 95
xiaochen  class1 yuwen  70
xiaochen  class1 shuxue 80
xiaolong  class2 yuwen  66
xiaolong  class1 shuxue  80
[root@localhost lianxi]# awk '{arr[$2]+=$4}END{for(i in arr){print i"--"arr[i]}}' test1.txt 
class1--506
class2--349
以什么来分组,就把什么作为key 

awk内置函数

算数相关:
int(x)
rand() – 随机返回0-1的小数
sqrt() – 开平方

字符串相关:
length(str) – 求长度
split(str, A, ‘指定分隔符’) – 切割str放到A里面
substr(str, M, [N]) – 对str从M的位置开始截取N个

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值