文本处理神器 sed、分析器 awk
目录
sed利用脚本来对文件进行处理,是一种非交互的流编辑器,按照脚本的指令来编辑、处理文本文件。其使用场景主要包括以下几种:
-
vi编辑困难的文本
-
过于庞大的文本
-
有规律的文本修改
sed [-hnV][-e script][-f script文件] 文本文件
选项与参数
-
-h 查看帮助
-
-n 仅显示处理后的结果
-
-V 显示版本信息
-
-e 指定处理的脚本命令
-
-f 指定处理的脚本命令文件
操作说明
-
a 在匹配行后面加入文本
-
c :字符替换
-
d :删除内容
-
i :在匹配行前面加入文本
-
p :打印匹配的行
-
s/old/new :用new替换正则表达式old
打开终端窗口,依次输入以下命令:$ cd base
$ mkdir text-sed
在当前目录下新建文件夹text-sed,作为本实验的工作目录。
再将file.txt和file2.txt复制到工作目录:$ cp file.txt file2.txt text-sed
$ cd text-sed
#在file.txt文件的第三行后添加一行“newLine”,并将结果输出:$ sed -e 3a
ewLine file.txt
linux
Windows
Mac OS
newLine
#在第二行后多输出一行“newLine”$ nl file.txt | sed '2a newLine'
1 linux
2 Windows
newLine
3 Mac OS
#在输出中删除第二行$ nl file.txt | sed '2d'
1 linux
3 Mac OS
#在输出中替换第二行$ nl file.txt | sed '2c newLine'
1 linux
newline
3 Mac OS
#在输出中搜索含有关键字的行,加-n后只显示匹配到的行$ nl file.txt | sed '/dow/p'
1 linux
2 Windows
2 Windows
3 Mac OS
$ nl file.txt | sed -n '/dow/p'
2 Windows
#在输出中删除含有关键字的行$ nl file.txt | sed '/dow/d'
1 linux
3 Mac OS
请在本实验工作目录下完成,在命令后追加"> 文件名"将内容输出到文件中。
任务一:
将file2.txt显示行号输出,并在第一行后添加一行“Unix is also an os”,并输出到文件sed_1.txt(50分)。 nl file2.txt | sed '1a Unix is also an os' > sed_1.txt
任务二:
将file2.txt显示行号输出,并搜索含有关键字’Mac‘的行重复输出,全部内容输出到文件sed_2.txt(50分)。先练习一下 nl file2.txt | sed '/Mac/p' > sed_2.txt
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项与参数
-
-F fs or –field-separator fs 指定分隔符,fs是字符串或正则表达式,如-F,
-
-v var=value or –asign var=value 定义变量
-
-f scripfile or –file scriptfile 从脚本文件中读取awk命令
#首先查看文件的全部内容$ cat file2.txt
1 linux is an os
2 Windows is an os
3 Mac OS is an os
#输出每行的第1、3项内容(默认由空格或tab划分)$ awk '{print $1,$3}' file2.txt
1 is
2 is
3 OS
#将每行以字符'i'划分,输出每行的第1、2项内容$ awk -Fi '{print $1,$2}' file2.txt
l nux
W ndows
Mac OS s an os
#使用内建变量'i'划分,输出每行的第1、2项内容$ awk 'BEGIN{FS="i"} {print $1,$2}' file2.txt
1 l nux
2 W ndows
3 Mac OS s an os
#使用多个分隔符划分,例如i和o$ awk -F '[io]' '{print $1,$3,$4}' file2.txt
1 l s an s
2 W ws s an
3 Mac OS s
#给变量赋值,并使用变量$ awk -va=2 -vb=The '{print $1+a,b$2}' file2.txt
3 Thelinux
4 TheWindows
5 TheMac
#使用运算符,输出第一项>=2,且第三项等于"is"的行的前四项内容,注意:第一项为标号$ awk '$1>=2 && $3=="is" {print $1,$2,$3,$4}' file2.txt
2 Windows is an
#使用正则表达式,查看包含"os"的行,忽略大小写awk 'BEGIN{IGNORECASE=1} /os/' file2.txt
1 linux is an os
2 Windows is an os
3 Mac OS is an os
awk脚本应当符合以下形式:
BEGIN{ 执行前语句 }
{执行中语句}
END {执行后语句 }
示例:
在工作目录下新建cal.awk脚本,填入以下内容:
BEGIN{
printf "begin
"
total=0
}
{
printf "Name is %%-8s
",$2
total=total+length
}
END{
printf "total length is %%2d
",total
printf "end"
}
该脚本用于计算文本文件总长度:$ awk -f cal.awk file2.txt
begin
Name is linux
Name is Windows
Name is Mac
total length is 51
新建文件夹text-awk作为本实验的工作目录,复制文件file2.txt到文件夹中。(10分)在命令后添加"> 文件名"输出内容到文件中。
任务一
使用's'作为分隔符,输出file2.txt每行的第2个内容到文件awk_1.txt中。(20分)
awk -Fs '{print $2}' file2.txt > awk_1.txt
任务二
默认分隔符,将file2.txt每行的第1项加2,第3项后面加"what"后输出到文件awk_2.txt中(30分)
awk -va=2 -vb=what '{print $1+a,$3b}' file2.txt > awk_2.txt
任务三
新建文件score.txt,填入以下内容:
Marry 78 84 77
Jack 66 78 45
Tom 48 73 71
Mike 87 97 95
Bob 40 57 62
编写awk脚本输出表头为“姓名 总成绩”,中间保留两个空格,之后各行依次输出每个人的名字(占6位)+总成绩(后三项之和,占3位),名字和成绩之间再保留1个空格,结果输出到文件awk_3.txt中。(40分)
这个稍有难度吧,对我一个初学者而言
首先创建一个.awk脚本,内容如下:脚本创建好其他就很简单了
BEGIN{
printf "姓名 总成绩
"
}
{
printf "%%-6s",$1
printf " "
printf "%%-3s",int($2)+int($3)+int($4)
}
END{
}