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" passwd | root字符之前不能有字符 |
grep -E “root>” passwd | root字符之后不能有字符 |
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…s | w开头s结尾中间4个任意字符 |
…s | s结尾前面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 westos | 1-5行 |
sed -n ‘5,$p’ westos | 5行到最后一行 |
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’ westostest | root行后面加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’ westostest | root行替换 |
sed ‘$chello westos’ westostest | 最后一行替换 |
参数 | 描述 |
---|---|
w | 把符合的行写到指定文件中 |
sed ‘/root/wfile’ | 把root行写到file文件中 |
参数 | 描述 |
---|---|
r | 整合文件 |
sed ‘5r file’ westostest | westostest文件中第5行,添加file文件内容 |
sed ‘5r file’ -i westostest | westostest文件中第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’ passwd | 1-5行的:换为%%% |
sed ‘/root/, /var/s/ : /####/g’ westos | root到var字符的:换为#### |
sed ‘1s/ : /####/g;4s/ : /####/g’ westos | 1行和4行 |
sed -e ‘1s/ : /####/g’ -e ‘4s/ : /####/g’ westos | 1行和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}’ westos | bash结尾和不含有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 )