使用Shell 自带的工具,实现对文本类文件的操作,满足日常数据处理的需求。
一、命令 sed -编辑工具
sed 是一款功能强大的非交互流式文本编辑器,可实现替换文件中的单词,一次处理一行内容,首先将该行内容放入缓存,在缓存中处理,完成后将缓存内容发送到终端。
基本语法是 sed [option] [set命令] filename
选项参数
sed -e 直接在指令模式进行sed编辑,当命令行多个sed才需要-e选项;
sed -i 直接对内容进行修改,不加该参数则只是预览;
sed -f 后跟保存了sed指令的文件;
sed -n 取消默认输出。
set 命令功能参数
a add新增,a的后面连接字符串;
c change 更改,更改匹配行的内容;
d delete 删除,删除匹配的内容;
i insert 插入,想匹配行前插入内容;
s substitute 替换,替换匹配到的内容;
n 读取下一行。
demo演示
1)指定行号前或后插入数据
原始文件如下所示。
行后插入,执行命令 sed -i ‘3a北京西城’ info.txt ,在第三行前添加北京西城,这里加i参数,是直接修改文件,执行结果如下所示。
行前插入,执行命令 sed -i ‘3i北京昌平’ info.txt ,在第三行前添加北京西城,执行结果如下所示。
2)指定内容前后插入内容
支持正则
行前插入,执行命令 sed ‘/北京/ihello’ info.txt ,在北京开头之前行插入 hello,执行结果如下所示。
3)最后一行后插入内容
行后插入,执行命令 sed ‘$alove java’ info.txt ,在最后一行插入love java,执行结果如下所示。
4)删除指定范围内容
删除用 d 命令功能,执行 sed ‘5,6d’ info.txt,即 删除5-6行,执行结果如下所示。
取反删除,执行 sed ‘1,3!d’ info.txt,即 保留1-3行,执行结果如下所示。
5)删除匹配行及其后面行
匹配行及其后内容,执行命令 sed ‘/张家口/,+1d’ info.txt,使用+1,执行结果如下图所示。
6)替换匹配行第一个指定的字符串
匹配行替换,执行命令 sed ‘s/北京/北京市/’ info.txt,使用 s,将北京替换成北京市,执行结果如下图所示。
全局替换,执行命令 sed ‘s/北京/北京市/g’ info.txt,使用 g 全局匹配。
替换第2个,执行命令 sed ‘s/北京/北京市/2’ info.txt,指定2,表示第2个。
替换第2个并写入文件,执行命令 sed -n ‘s/北京/北京市/2pw infodata.txt’ info.txt,使用 -n 获取匹配的,-p 打印出来,w 写入文件。
7)每行末尾拼接 text
匹配行替换,执行命令 sed ‘s/dollar/& test/’ info.txt,使用 s,将北京替换成北京市,执行结果如下图所示。
8)每行首位拼接 #
匹配行替换,执行命令 sed ‘s/^/&#/’ info.txt,使用 s,将北京替换成北京市,执行结果如下图所示。
注意:替换类的命令,需要 / 来结尾。
9)查询匹配的内容
匹配显示字符串,执行命令 sed -n ‘/北京/p’ info.txt,使用 -n 匹配到的,p打印显示,查找北京,执行结果如下图所示。
10)执行多个sed命令
方式一:用 -e 连接,命令 sed -e ‘1d’ -e ‘s/北京/北京市/g’ info.txt,多个sed 同时执行,效果如下所示。
方式一:用 ; 连接,命令 sed ‘1d;s/北京/北京市/g’ info.txt,多个sed 同时执行,效果如下所示。
二、命令 awk -分析工具
awk 强大的文本分析工具,把文件逐行读入,以空格默认分隔符将每行切片,切片部分进行各种分析处理。
基本语法 awk option ‘pattern{action}’ filename{}
选项参数
-F 指定输入文件拆分的分隔符;
-v 赋值一个用户定义变量。
内置函数
NF 浏览记录的域的个数,根据分隔符分割后的列数;
NR 行号,已读的行数;
$n $0变量值整条记录,$1 当前行第一个域
$NF number finally 表示最后一列信息。
demo演示
数据准备:复制文件 cp /etc/passwd ./
1)匹配打印数据
执行命令,echo “我 爱 中国 北京” | awk ‘{print $1"&“$2”&“$3”&"$4}’ ,空格分割抽取数据,按占位符拼接匹配,执行效果如下图所示。
2)正则查询
执行命令,ls -a | awk ‘/^c/’ ,打印 c 开头的文件,执行效果如下图所示。
3)按列打印
打印第一列,执行命令,awk -F: ‘{print $1}’ passwd,即 $1,执行效果如下图所示。
打印倒数第一列,执行命令,awk -F: ‘{print $NF}’ passwd,即 NF,执行效果如下图所示。
打印倒数第二列,执行命令,awk -F: ‘{print $(NF-1)}’ passwd,即 NF-1,执行效果如下图所示。
4)打印指定行
打印第10-18行,执行命令,awk -F: ‘{if(NR>=10 && NR<=18){print $1}}’ passwd,执行效果如下图所示。
5)添加开始和结束信息
开始结束添加说明文字,执行命令,echo -e “henu\nzknu” | awk ‘BEGIN{print “welcome…”}{print $0}END{print "end… "}’,执行效果如下图所示。
6)循环遍历输出打印
循环,执行命令,echo “北京 上海 深圳 驻马店 " | awk -v str=”" ‘{for(n=1;n<=NF;n++){ str=str dollar n}} END {print str}’,执行效果如下图所示。
7)添加空行并显示行号
添加空行,执行命令,sed ‘G’ info.txt,隔行插入空行,执行效果如下图所示。
显示空行的行号,执行命令,awk ‘/^dollar/{print}’,NR表示行号,执行效果如下图所示。
三、命令 wc
wc 是统计文件行数、字节和单词数的命令。
基本语法是 wc [option] filename
选项参数
-c 显示文件的字节数byte;
-l 显示文件的行数;
-m 显示文件的字符数;
-w 显示文件有包含的单词数。
demo演示
1)获取文件行号
原始文件如下所示。
执行命令 cat info.txt | wc -l,查询文件的行号,这里可以看到 行数为 7,但实际上是8。
在文件末尾添加一行后,再次执行命令 cat info.txt | wc -l,这里可以看到 行数为 8。
注意
wc -l 以 ‘\n’ 作为行结束的标志,若缺少的话,显示会比实际少一行。
// 查询行数,判断每行是否存在空串
grep -c “” info.tx
文本操作 总结如下:
文本操作四剑客( grep sed awk cut)
grep 用于查找匹配的行;
cut 截取数据,按列分隔符提取按个计算,不适合截取文件中存在多个空白符;
sed 增删查改,用于文本中按行截取;
awk 截取分析数据,在某个文件中以竖列截取分析数据,若存在多个空格也支持。