1 当我们需要在程序中完成文本处理工作的时候,需要一些能够在命令行完成的编辑工具,如
sed和awk,比如说许多文本编辑都是对文本的每一行进行操作,那么这个时候就能够用到sed
2 sed为流编辑器,流编辑器能够对管道中标准输入接收的数据进行编辑
3 sed是基于行的,其按顺序对每一行执行命令,然后将结果写入到标准输出,它不修改任何
输入文件
4 使用sed删除或指定文件的某行
1) sed -e 'd'/xxx_file #删除xxx_file文件中的每一行
2) sed -e'nd' /xxx_file #删除xxx_file文件中的第n行
3) sed -e'n,md' /xxx_file #删除xxx_file文件中的n到m行(包括n和m行)
4) sed -e'/regex/d' /xxx_file #删除xxx_file文件中,匹配正则表达式regex的行
#例如 sed -e '/^#/d' /xxx_file为删除xxx_file中以#开头的行
5 将4中的d换成p则是打印指定的行,换成=;p则是打印行号,换成ni是在第i行插入,换成a表示追加
6 如果在sed中同时带有-n参数,则除非明确使用p,否则不进行打印
7 可以指定两个逗号分开的规则表达式,从匹配的第一个规则表达式的第一行开始,到匹配
第二个规则表达式的行结束(包括该行),sed将于所有这些行匹配,如下
sed -e'/BEGIN/,/END/p' /xxx_file
8 可以使用sed来替换文本,替换格式如下 s///g,如果没有g,则只替换第一次匹配,否则全部
替换
9 替换功能可以与地址范围一起使用,格式如下:
sed -e'n,ms/regex/string/g' /xxx_file
10 替换格式中的/可以使用其他的符号进行替换,如s:::, s@@@等,则上边的表达可以表达为:
sed -e'n,ms:regex:string:g' /xxx_file
11 注意sed的正则表达式匹配是最长匹配
12 可以将多条命令与一个地址范围一起使用,表达式如下:
sed -n -e'n,m{s/reg1/str1/g;s/reg2/str2/g;...;p}’ /xxxfile
13 实战
1) 把jon的名字改成jonathan
Sed –e ‘s/jon/jonathan/g’ xxx_file
2) 删除头3行
Sed –e ‘1,3d’xxx
3) 显示5-10行
Sed -n –e ‘5, 10p’ xxx
4) 删除包括Lane的行
Sed –e ‘/Lane/d’ xxx
5)显示所有生日在11-12之间的行
6)把3个*行条件到以Fred开头的行
7)用JOSEHAS RETIRED取代包括Jose的行
8)把Proeye的生日改成11/14/46
9)删除所有空白行
10)写一个脚本
在第一行之前插入标题PERSONNEL FILE
删除以500结尾的工资
显示文件内容,把姓和名颠倒
在文件末尾添加THE END
1 awk常常用于处理字段,所谓字段,就是在文本文件中,每一行分成多列,列与列之间用特定的符号隔开。
2 awk中使用位置变量来表达当前处理的是哪一个字段,$0则表示当前行的内容,awk使用{}来定义一段可以
执行的代码块,如果在命令行中直接定义代码块,需要使用单引号进行引用
3 awk默认使用空格进行分割,如果需要使用其他的分隔符,方法如下:
awk-F":" '{i++} ' /xxx_file
4 awk会针对每一个输入行执行一段代码块,另外awk提供BEGIN和END块,前者是awk初始化时候执行,后者
是awk结束时执行,都只执行一次,因此awk的代码块编写方式完整格式如下:
BEGIN{}
/reg/{}
{}
...
{}
END{}
5 我们可以使用如下方式来决定某个代码块是否执行
/regex/{},如果当前正则表达式满足,则执行,否这不执行
6 awk包含两种变量:自定义变量和内建变量
其内建变量包含:
FILENAME : 当前输入的文件名
FNR : 输入文件的记录数
FS :字段分隔符
RS :输入记录分隔符
NF :记录字段数
NR :在工作中的记录数
OFS :输出字段分隔符
ORS :输出记录分隔符,默认为\n
7 awk允许在数组名称之后,以方括号将任意数字或者字符串表达式扩起来作为索引,如下
arr["ab"]=1
arr[1]="dawd"
arr['cd']=2
同时,awk支持使用delete来删除某个数组元素或所有元素,如下
delete arr[1]
delete arr
8 awk支持直接对系统环境变量进行范围,通过ENVIRON数组,如ENVIRON["HOME"]
9 awk中的print语句使用空格或者逗号分割不同的部分,也可以不使用任何符号来进行连接
Print “ab”$1”cd”$2
print “ab” $1 “cd” $2
print “ab”,$1, “cd”, $2
10 awk允许使用算术运算符,其内容大致与java语言相同,其中较为特殊的符号如下:
~ 匹配正则表达式
~! 不匹配正则表达式
^*** 求幂
in 数组成员
11 awk中语句编写方式与shell相同,可以使用;或者换行符进行分割
12 awk中支持顺序,条件和循环判断语句,如下:
if,同java
while,同java
do-while,同java
for,同java
break,continue,大体同java,但是不支持定点退出
13 awk支持函数,函数的定义如下:
functionfunc(arg1, arg2, arg3, loc1, loc2,...) {}
1)函数支持参数的值传递和引用传递,由于awk不支持取地址运算,所以引用传递只能通过
数组实现
2)函数可以通过return返回值,如果不使用return,系统会默认返回0或者空字符串
3)在函数体中使用,且没有出现在参数列表上的变量,函数视为全局变量。对于参数列表
中的局部变量,通常在声明的时候在其前边放置多个空白
4)支持递归调用
14 awk提供了两种格式化方式:
1)printf,用法同c语言,如printf("%020x dawd %d","abc", 10);
且同时会把格式化的字符串打印到标准输出
printf提供如下格式化字符以供使用:
c ASCII字符
s 字符串
d 十进制整数
ld 十进制长整数
u 十进制无符号整数
lu 十进制无符号长整数
x 十六进制整数
lx 十六进制长整数
o 八进制整数
lo 八进制长整数
e 科学计数法浮点数
f 浮点数
g e或f中较短的形式
- 左对齐
# 八进制整数前加0,十六进制整数前加0x
+ 显示使用d,e,f,g转换整数时,加上+或-
0 用0而不是用空白符来填充所显示的值
2)sprintf,用法同printf,但是会把格式化字符串返回,并赋值给变量
15 字符串处理内置函数
sub(/reg/,newsubstr, str) 替换第一个匹配的字符串
gsub(...) str中匹配的的字符串全替换
index(str,substr) substr在str中的索引
length(str) str的长度
match(str,/reg/) 如果找到匹配的串,返回出现的位置,否则返回0(字符串第一个索引为1)
split(str,array, sep) 使用sep分割str,并将结果放入到array中
substr(str,pos[, length]) 返回str中pos开始的length个字符
toupper(str) 大写化
tolower(str) 小写化
sprintf(...) 格式化
16 算术函数
sin(x)
cos(x)
atan2(x) 余切
int(x) 去整,过程没有舍入
exp(x) 求幂
log(x) 自然对数
sqrt(x) 平方根
rand() 生成一个大于等于0,而小于1的随机数
srand(x) x是rand()函数的种子,如果没有x,则以当前时间为种子,
通常在rand之前调用srand()以制作一个起随机数
Srand()
Rand()