背景介绍

使用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 截取分析数据,在某个文件中以竖列截取分析数据,若存在多个空格也支持。