Linux的awk、grep、sed工具,实现文本查找、编辑 、格式化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的awk、grep、sed工具,实现文本查找、编辑 、格式化相关的知识,希望对你有一定的参考价值。

参考技术A awk、grep、sed是linux文本操作的三大利器,grep适合单纯的查找或文本匹配,sed适合编辑匹配到的文本,awk适合格式化文本,对文本进行较复杂格式处理。

命令格式:grep [option] pattern file 用于过滤/搜索的特定字符,可与正则表达式配合,使用上十分灵活。

命令格式:sed [options] '[地址定界] command' file(s) 用于编辑一个或多个文件, 简化对文件的反复操作。
演示实例:

命令格式:awk [options] 'BEGIN action;… pattern action;… END action;… ' file ... 用于在linux下对文本和数据进行处理,数据可以来自一个或多个文件,支持用户自定义函数和动态正则表达式等功能。
演示实例:

a.随机取用户
cat file1 | awk ' print rand(),$1 ' |sort -k1 |awk ' print $2 ' |head -4000

b.分组求和
awk 's[$1] += $2END for(i in s) print i, s[i] ' file1 > file2

c.求和
cat data|awk 'sum+=$1 END print "Sum = ", sum'

d.求平均
cat data|awk 'sum+=$1 END print "Average = ", sum/NR'

e.求标准偏差
cat $FILE | awk -v ave=$ave 'sum+=($1-ave)^2ENDprint sqrt(sum/(NR-1))'

f.列换成行,如果第一列相同,将所有的第二列 第三列 都放到一行里面
awk 'qq[$1]=qq[$1](" "$2" "$3)ENDfor(i in qq)print i,qq[i]'

g.合并文件,2个文件,每个2列,将他们按照第一列相同的数,来合并成一个三列的文件,同时,将每个文件中针对第一列对应第二列中没有的数补0
awk 'FNR==NRa[$1]=$2FNR<NRa[$1]?a[$1]=a[$1]" "$2:a[$1]=a[$1]" 0 "$2ENDfor(i in a)print i,a[i]' file1 file2 > file3

Shell文本处理工具(Linux三剑客 grep sed awk )


一、grep

1.作用

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户

2.grep 格式

grep 匹配条件 处理文件,grep -E = egrep

主要参数描述
grep root passwd过滤root关键字
grep -i root passwd忽略大小写,过滤root关键字
grep -E " \\<root" passwdroot字符之前不能有字符
grep -E “root>” passwdroot字符之后不能有字符
grep -数字显示过滤行以及上面几行和下面几行
grep -n显示匹配的行所在行号
grep -A显示过滤行以及下面几行
grep -B显示过滤行以及上面几行
grep -v反向过滤

grep bash$ passwd #过滤bash结尾的行

在这里插入图片描述

grep -E “bash$ | nologin$” pasword #过滤bash结尾或nologin结尾的行

在这里插入图片描述

grep root pasword #过滤root行
grep -i root pasword #忽略大小写,过滤root行
grep -iE “<root” pasword #忽略大小写,过滤root开头的行
grep -i “<root>” pasword #忽略大小写,过滤关键字只含有root的行

在这里插入图片描述

grep -n Root #显示Root行所在行号

在这里插入图片描述

grep -5 Root #显示Root行以及上面5行和下面5行

在这里插入图片描述

grep -A5 #显示过滤行以及下面几行
grep -B5 #显示过滤行以及上面几行
grep root -v #反向过滤不包含root行

在这里插入图片描述

3. grep字符数量匹配规则

字符描述
^westos以westos开头
westos$以westos结尾
w…sw开头s结尾中间4个任意字符
…ss结尾前面5个任意字符
*0次到任意次
?0到1次
+1次到任意次
{n}n次
{m,n}m到n次
{0,n}0-n次
{,n}0-n次
{m,}最少m次
(lee){2}lee字符串出现2次

grep “w…s” westos ##过滤以 w 开头,s 结尾中间2个字符的行;
grep “w.*s” westos ##过滤以 w 开头,s 结尾中间0-任意个字符的行 ;

在这里插入图片描述

grep -E “w.{3}s” westos ##过滤以 w 开头,s 结尾中间有三个字符的行;
grep -E ‘-w.{1,}s’ westos ##过滤以 w 开头,s 结尾中间有至少1个字符的行;
grep -E ‘-w.{1,3}s’ westos ##过滤以 w 开头,s 结尾中间有1-3个字符的行;

在这里插入图片描述

grep -E ‘-w.?s’ westos ##过滤以 w 开头,s 结尾中间有0-1个字符的行;
grep -E ‘-w.+s’ westos ##过滤以 w 开头,s 结尾中间有1-任意个字符的行;

在这里插入图片描述

grep -E ‘-w.{,3}s’ westos ##过滤以 w 开头,s 结尾中间有0-3个字符的行;
grep -E ‘-we{,3}s’ westos ##过滤以 w 开头,s 结尾中间有0-3个字符的行;
grep -E ‘-web{,3}s’ westos ##过滤以 w 开头,s 结尾中间b有0-3次的行;
grep -E ‘-w(eb){,3}s’ westos ##过滤以 w 开头,s 结尾中间eb有0-3次的行;

在这里插入图片描述

二、sed

sed是一种流编辑器,它一次处理一行内容,锁一个关键子,一个条件。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed 参数 命令 处理对象;
sed 参数 处理对象 -f 处理规则文件

实验素材:
在这里插入图片描述

1. 对字符的处理

参数描述
p显示
sed -n 5p westos显示第五行
sed -n 3,5p westos显示3到5行
sed -n "3p;5p westos显示3和5行
sed -n 1,5p westos1-5行
sed -n ‘5,$p’ westos5行到最后一行
sed -n ‘/^#/p’ fstab显示以#开头的行

sed ‘5p’ westostest #5行多显示1次,不加n多显示

在这里插入图片描述

sed -n ‘5p’ westostest##只显示第5行
sed -n ‘3,5p’ westostest ##显示第3行到第5行
sed -n ‘3p;5p’ westostest ##显示第3和第5行

在这里插入图片描述

sed -n ‘$p’ westostest #显示最后1行

在这里插入图片描述

sed -n ‘/root/p’ westostest #显示含有root的行
只能锁锁一个关键子,一个条件

在这里插入图片描述

参数描述
d删除
sed ‘5d’ westostest删除第五行
sed ‘/root/d’ westostest删除含root行
sed ‘5d;$d’ westostest第5行和最后一行删除

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

参数描述
a后面添加
sed ‘5ahello westos’ westostest第5行后面加hello westos
sed ‘/root/ahello westos’ westostestroot行后面加hello westos
sed ‘$ahello westos’ westostest最后1行后面加hello westos
sed ‘$ahello\\nwestos’ westostest最后1行后面加hello换行westos

在这里插入图片描述在这里插入图片描述在这里插入图片描述

参数描述
i前面插入
sed ‘5ihello westos’ westostest第5行前面加hello westos
sed ‘$ihello westos’ westostest最后1行前面加hello westos
sed ‘$ihello\\nwestos’ westostest最后1行前面加hello 换行 westos

在这里插入图片描述在这里插入图片描述

参数描述
t替换
sed ‘1chello westos’ westostest第1行替换
sed ‘/root/chello westos’ westostestroot行替换
sed ‘$chello westos’ westostest最后一行替换

在这里插入图片描述在这里插入图片描述

参数描述
w把符合的行写到指定文件中
sed ‘/root/wfile’把root行写到file文件中

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

参数描述
r整合文件
sed ‘5r file’ westostestwestostest文件中第5行,添加file文件内容
sed ‘5r file’ -i westostestwestostest文件中第5行,添加file文件内容,westostest文件内容改变

在这里插入图片描述在这里插入图片描述

2. sed字符替换

实验素材
在这里插入图片描述
不加g是每行的第一个

参数描述
sed ‘s/ : /####/g’ passwd全文的:换为####
sed ‘=’ passwd每行前面加行号
sed ‘=’ passwd \\ sed ‘N;s/\\n//g’每行前面加行号,去掉换行符,提前加载处理行的下一行:N
sed ‘=’ passwd \\ sed ‘N;s/\\n//g’ > westos两个管道符处理的导入到文件
sed ‘G’ westos每行后面加空行
sed ‘$G’ westos最后一行加空行
sed ‘$!G’ westos除了最后一行不加空行
sed ‘1,5s/ : /%%%/g’ passwd1-5行的:换为%%%
sed ‘/root/, /var/s/ : /####/g’ westosroot到var字符的:换为####
sed ‘1s/ : /####/g;4s/ : /####/g’ westos1行和4行
sed -e ‘1s/ : /####/g’ -e ‘4s/ : /####/g’ westos1行和4行
sed ‘s///###/g’ westos全文/,需要转义
sed ‘s@/@###@g’ westos全文/,需转义

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

三、awk

用法:

 awk -F 分隔符 BEGIN{ }{ }END{ } FILENAME

参数:

NR ##行数
NF ##列数
FILENAME ##文件名称本身
westos ##westos变量值
“westos” ##westos字符串

条件:

/bash$/ ## 条件
/条件1|条件2/ ##条件1或者条件2
/条件1/||/条件2/ ##条件1或者条件2
/条件1/&&/条件2/ ##条件1并且条件2

含义

$0 ##所有的列
$1 ##第一列
$2 ##第二列
$3 ##第三列

命令含义
awk -F : ‘BEGIN{print westos}{print $1}END{print end}’ westos不引起来变量
awk -F : ‘BEGIN{print “westos”}{print $1}END{print “end”}’ westos第一行前面输出westos,最后一行后输出end,输出以:分割的第一列
awk -F : ‘BEGIN{N=0}{N++}END{print N}’ westos统计多少行,符号条件行:
awk -F :’{print $1}’ westos:分割的每行的第一列
awk -F :’/bash$/{print $1}’ westos:分割,以bash结尾的第一列
awk -F :’/bash$/&&/root/{print $1}’ westos含有root行和bash结尾行的第一列
awk -F :’/bash$/&&!/root/{print $1}’ westosbash结尾和不含有root行的第一列
awk -F :’/bash$/
awk -F :’/bash$root/{print $1}’ westos
awk -F :’!/bash$root/{print $1}’ westos
awk -F : ‘$7~/bash/{print $1}’ westos第7列是bash的行输出第一列
awk -F : ‘$7!~/bash/{print $1}’ westos第7列不是bash的行输出第一列
awk -F : ‘$7!~/bash/{print $0}’ westos第7列不是bash的行,输出全部列

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述两个条件,一条件两个元素,结果相同
在这里插入图片描述在这里插入图片描述

awk -F : ‘$7~/bash/{print $1}’ westos #第7是bash的行输出第一列
awk -F : ‘$7!~/bash/{print $1}’ westos #第7不是bash的行输出第一列

在这里插入图片描述在这里插入图片描述

awk -F : ‘$7!~/bash/{print $0}’ westos #第7不是bash的行,输出全部列

在这里插入图片描述

练习

1. 过滤/etc/passwd中间的root

在这里插入图片描述

2. 请显示系统中能被su命令切换的用户名称

在这里插入图片描述在这里插入图片描述测试:
在这里插入图片描述

3. Apache_port.sh

此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080
在这里插入图片描述测试:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4. 统计在系统中能su切换的并且用户加目录不在/home下的用户数量

在这里插入图片描述测试:
在这里插入图片描述

5. 内存使用率累加求和

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
测试:
在这里插入图片描述

以上是关于Linux的awk、grep、sed工具,实现文本查找、编辑 、格式化的主要内容,如果未能解决你的问题,请参考以下文章

Shell文本处理工具(Linux三剑客 grep sed awk )

Linux的文本处理工具浅谈-awk sed grep

Unix & Linux的文本处理工具 -- grep, sed & awk

Linux文本处理三剑客grepsedawk用法详解

文本处理工具之:grep sed awk

linux三大文件处理工具(grep/sed/awk)