shell脚本之grep,sed,awk

一、grep

强大的全局文本搜索命令,并能将匹配到的文本按行打印
支持正则表达

用法

grep [OPTIONS] PATTERN [FILE]  

或者
cat FILE|grep [OPTIONS] PATTERN 

1 常用的OPTIONS

-c    统计匹配到的行数  
-i    匹配时不区分大小写
-n    显示匹配行所在行号
-o    只显示匹配到的字符串
-v    取反,方向匹配,不匹配关键字的行
-E    开启扩展的正则表达式
-A n  显示匹配的所在的行及其后n行
-B n  显示匹配的所在的行及其前n行
-C n  显示匹配的所在的行及其前后各n行

 

2 PATTERN部分

主要为基本正则表达式

 

2.1 基本字符组

.          匹配除换行符外的任意一个字符
.*         匹配所有内容
[abc]      匹配abc三个字符中的任意一个字符
[^abc]     匹配不包含abc三个字符中的任意一个字符(与[abc]相反)

 

2.2 特殊字符组

[A-Za-z] 等价于 [[:alpha:]]       匹配任意字母字符,不管大小写
[0-9] 等价于 [[:digit:]]          匹配任意数字字符
[A-Za-z0-9] 等价于 [[:alnum:]]    匹配任意字母数字字符
tab,space 等空白字符 [[:space:]]   匹配任意空格符
[A-Z] 等价于 [[:upper:]]          匹配任意大写字目字符
[a-z] 等价于 [[:lower:]]          匹配任意小写字母字符
[[:punct:]]                      匹配标点符号

 

2.3 出现次数

*        前面的字符出现任意次,包括0次
\?       前面的字符出现0次或1次,\为转义符
\+       前面的字符至少出现一次
\{m\}    前面的字符出现m次,\为转义符
\{m,\}   前面的字符至少出现m次,\为转义符
\{m,n\}  前面的字符至少出现m次,至多n次,\为转义符

 

2.4 位置锚定

^    锚定行首,即以什么开头
$    锚定行尾,即以什么结尾
^$   空白行
\b   锚定词首或词尾,前面为词首,如"\bwho"匹配到whoami,后面为词尾,如"who\b"会匹配到iswho
\<   锚定单词的词首
\>   锚定单词的词尾
\B   与\b作用相反

 

2.5 ()分组引用

\(str\)  用()将str作为一个整体方便后面引用,第一个()为$1,以此类推
\1          引用第1个左括号及其对应的右括号所匹配的内容
\n          引用第n个左括号及其对应的右括号所匹配的内容

 

3 扩展的正则表达式 

即OPTIONS的-E选项

字符组和特殊字符组与基本正则表达式一样

次数和位置锚定 没有转义符,其他的和基本正则表达式一样
分组引用 (string) \
1 \n

 

二、sed 

非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作
支持正则表达式

 

用法

sed OPTIONS sed命令 FILE

sed OPTIONS -f 包含sed命令的FILE FILE

 

1 OPTIONS

-e  用于进行多重编辑,即同时有多个sed命令时使用,即sed -e sed命令 -e sed命令 FILE
-f  后接包含sed命令的FILE
-i  直接修改FILE内容,不加-i时只是预览,不会修改FILE内容
-n  取消默认的输出,只显示处理过的行,sed默认输出FILE的所有内容
-r  使用扩展正则表达式,默认只识别基本正则表达式

 

2 sed命令

a   新增,指定行后方加入新行
i   新增,指定行前方加入新行
c   替换行,将指定行的内容全部替换
d   删除
p   将指定内容打印到终端上,通常与OPTIONS -n 一起用
s   替换指定字符串

 

3 基本使用

3.1 显示

若str包含变量,请使用双引号("")

sed -n 'Np;Mp;Xp' FILE 显示行号为N,M,X的多行 sed -n '$p' FILE 显示最后一行 sed -n '/str/p'FILE 显示包括str的所有行 sed -n 'N,Mp' FILE 显示第N行到第M行

 

3.2 删除

以下命令只是预览,不会真正修改文件内容,若下行要修改文件内容,请使用sed -i 
若str包含变量,请使用双引号("") sed
'N,Md' FILE 显示删除第N行到第M行剩下的内容 sed '/str1/,/str2/d’ FILE 显示删除包含str1的行到包含str2的行剩下内容 sed '/str/,Nd' FILE 显示删除包含strt的行到第N行剩下的内容 sed '/str/d' FILE 显示删除包含str的行剩下的内容 sed '/^$/d' FILE 显示删除空白行剩下的内容

 

3.3 增加

以下命令会真正修改文件内容,请谨慎使用
若str包含变量,请使用双引号("") sed
-i 'Na str' FILE 第N行后增加一行字符 sed -i 'Na str1\nstr2' FILE 第N行后增加二行字符 sed -i 'N,Ma str' FILE 第N行到第M行的每行后都增加一行字符 sed -i 'Ni str' FILE 第N行前增加一行字符 sed -i 'Ni str1\nstr2' FILE 第N行前增加二行字符 sed -i 'N,Mi str' FILE 第N行到第M行的每行前都增加一行字符

 

3.4 替换

以下命令会真正修改文件内容,请谨慎使用
若str包含变量,请使用双引号("")
sed
-i 'Nc str' FILE 将第N行的内容替换为str sed -i 'N,Mc str' FILE 将第N行到第M行的内容替换为str sed -i 's/str1/newstr/g' FILE 将所有的str1替换为newstr sed -i 's/str1/newstr2/gw FILE1' FILE2 将处理过的行另存到文件1 sed -i 's/str1/newstr/g' FILE2 >FILE1 将处理后的内容重定向至文件1

 

 

 

三、awk
文本处理工具,以字段为单位进行处理
支持正则表达式

 

用法

awk [OPTIONS] '[pattern] {action}' FILE

cat FILE |awk [OPTIONS] '[pattern] {action}'

 

1 awk内置变量

1.1 字段和分隔符变量

$0  满足条件的所有文本内容
$1  以FS分隔符隔开的第一列内容
$2  以分隔符隔开的第二列内容
$n  以分隔符隔开的第n列内容

FS     指定字段(列)分隔符,默认空格 
RS     指定处理时的行分隔符,遇到该符号就是一行,默认换行符
OFS    指定输出的字段(列)分隔符,默认空格
ORS    指定输出的行分隔符,行以该符号结尾,默认换行符

 

1.2 数据变量

ARGC  命令行的参数个数
ARGV  命令行所有参数组成的数组
ARGIND  被处理文件在ARGV中的位置

NF    当前行的字段个数,即列数
NR    当前行的行号
FNR    处理多个文件时,当前行在本文件中的行号

FIELNAME 被处理的文件名

IGNORECASE    如果为真,则进行忽略大小写的匹配
CONVFMT    数字转换格式 %.6g
ENVIRON    UNIX环境变量
ERRNO    UNIX系统错误消息
FIELDWIDTHS    输入字段宽度的空白分隔字符串
OFMT    数字的输出格式 %.6g
RSTART    被匹配函数匹配的字符串首
RLENGTH    被匹配函数匹配的字符串长度
SUBSEP    \034

 

2 OPTIONS

-F  指定分隔符,默认为空格,包括一个或多个空格键或tab键
-v  定义变量和初始值,可以在 pattern {action}使用
-f  后接包含pattern {action}的文件

 

3 [pattern] {action}

3.1 pattern

1) BEGIN和END

BEGIN    在awk尚未读取任何数据之前执行,只执行一次
END        在awk处理完文本所有数据后执行,只执行一次

其中
BEGIN中定义的变量只能在当前的BEGIN中使用
END中定义的变量只能在当前的END中使用


示例 awk
'BEGIN {print "ready start!"} /a/{print $0}' FILE 先输出ready start!,再输出包含字符'a'的整行内容 awk '/a/{print $0} END {print "ready start!"}' FILE 先输出包含字符'a'的整行内容,再输出ready start!

 

2) 关系运算符

>
<
>=
<=
==
!=

示例
awk 'NR>2 {print $0 }' FILE
输出行号大于2的所有行

awk 'NR<2 {print $0 }' FILE
输出行号小于2的所有行

awk 'NR>=2 {print $0 }' FILE
输出行号大于等于2的所有行

awk 'NR<=2 {print $0 }' FILE
输出行号小于等于2的所有行

awk 'NR==2 {print $0 }' FILE
输出行号等于2的行

awk 'NR!=2 {print $0 }' FILE
输出行号不等于2得所有行

awk -F ',' '$1==10 && $2==9 {print $0 }' FILE
输出第一列为10,第二列为9的行的内容

awk -F ',' '$1==10 || $2==9 {print $0 }' FILE
输出第一列为10或者第二列为9的行的内容

 

3) 匹配操作符

匹配操作符
str1 ~ /str2/ 
str1 !~ /str2/

其中
str2可以是正则表达式

示例 
awk -F ',' '$1 ~ /^asd/ {print $0 }'  FILE
输出第一列以asd开头的行的内容

awk -F ',' '$1 !~ /^asd/ {print $0 }'  FILE
排除第一列以asd开头的行

 

4) 正则表达式

/str/  匹配含有str的内容

示例
awk -F ',' '/^asd/ {print $0 }'  FILE
输出以asd开头所有行的内容

 

3.2 {action}

1) 格式化输出printf

基本很少使用,使用print频率极高

c   以ASCII码显示
d   以整数显示
i   以整数显示
e   以科学计数法显示
f   以浮点数显示
g   以科学计数法或浮点数显示
o   以八进制显示
s   以字符串显示
x   以十六进制显示
X   以十六进制显示,但用大写字母A~F

awk -F ',' '$1 ~ /^[0-9][0-9]*/ {printf "%e,%f\n",$1,$3 }'  FILE
输出第一列全是数字的第一列,第三列,并以科学计数法显示第一列,浮点数显示第三列

注意:
prtinf必须有\n,否则不会换行

 

2) 结构化流程控制

A if语句

awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0}' FILE
输出第二行或者第一个字段包含字符a的行

awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0;else print NR,$1}' FILE
输出第二行或者第一个字段包含字符a的行,以及不满足条件的行号和第一列

 

B wihle语句

awk -F ',' '{total=0;i=1; while (i<4){total+=$i;i++} avg=total/3;print avg }'  FILE
输出前三列的平均值

其中
$i表示第几列数据

 

C do-while语句

awk -F ',' '{total=0;i=1; do {total+=$i;i++} while (i<5);print total }'  FILE
输出前四列之和

其中
$i表示第几列数据

 

D for语句

awk -F ',' '{total=0; for(i=1;i<5;i++) {total+=$i};print total }'  FILE
输出前四列之和

其中
$i表示第几列数据

 

posted @ 2020-07-11 10:17  junffzhou  阅读(570)  评论(0编辑  收藏  举报