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表示第几列数据