[转帖]shell脚本实现文本内容比较交互程序
背景介绍
脚本基于Comm命令进行功能封装,考虑到命令执行前需要对文本进行排序,并且在多文件需要比较内容时可能会导致多个文本混乱,因此使用Shell封装成了一个交互式程序,快速对文件内容进行判断和输出想要的内容内容结果。
脚本介绍
- 文件内容校验(是否一致内容)
- 定制化输出文本(1.仅文本单独出现内容;2.共同出现内容)
- 交互式便捷使用
实现代码
!/bin/bash初始化变量
E_CODE=65 #退出状态码
FILE_1=$1 #第一个文本
FILE_2=\(2 #第二个文本
FILE_SUM=\)#传参数检测函数
init(){if [ ! $FILE_SUM -eq 2 ]
then
echo "Usage:$0 filename_1 filename_2 " && exit $E_CODE
fi
}
文本检测
txt_check(){
#传参文件类型检测
if [ ! -f \(FILE_1 ] ;then echo "\)FILE_1文件错误,请检查文件合规性!" && exit E_CODE;fi
if [ ! -f \(FILE_2 ] ;then echo "\)FILE_2文件错误,请检查文件合规性!" && exit E_CODE;fi#传参文件内容是否为空检测
if [ `grep -q '[^[:space:]]' $FILE_1;echo $?` -ne 0 ] ;then echo "${FILE_1##/*/}文件内容为空,请重新选择指定文件!" && exit E_CODE;fi
if [ `grep -q '[^[:space:]]' $FILE_2;echo $?` -ne 0 ] ;then echo "${FILE_2##/*/}文件内容为空,请重新选择指定文件" && exit E_CODE;fi
}
文本内容校验
judge_comm(){
clear
local file12_all file1_line file2_line
#FILE_1文件行数
file1_line=awk '{print $0}' $FILE_1 | wc -l
#FILE_2文件行数
file2_line=awk '{print $0}' $FILE_2 | wc -l
file1_only=comm -2 -3 <(sort $FILE_1) <(sort $FILE_2) | wc -l
file2_only=comm -1 -3 <(sort $FILE_1) <(sort $FILE_2) | wc -l
#相同内容行数
file12_all=comm -1 -2 <(sort $FILE_1) <(sort $FILE_2) | wc -l
#原文件行数和共同行数一致,文件内容相同
if [ "\(file1_line" -eq "\)file12_all" -a "\(file2_line" -eq "\)file12_all" ]
then
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
echo -e "\033[41;37m[\({FILE_1##/*/}]和[\){FILE_2##//}]文件内容完全一致\033[0m"
elif [ "\(file12_all" -eq "0" ]
then
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
echo -e "[\){FILE_1##//}]和[\({FILE_2##/*/}]文件内容不一致,无相同内容\033[0m"
elif [ "\)file12_all" -gt 0 ]
then
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
if [ "\(file1_only" -eq 0 ]
then
echo -e "\033[41;37m[\){FILE_2##//}]包含[\({FILE_1##/*/}]的内容\033[0m"
elif [ "\)file2_only" -eq 0 ]
then
echo -e "\033[41;37m[\({FILE_1##/*/}]包含[\){FILE_2##//}]的内容\033[0m"
else
echo -e "\033[41;37m[\({FILE_1##/*/}]和[\){FILE_2##//}]文件内容不一致\033[0m"
fi
else
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
echo -e "\033[41;37m[\({FILE_1##/*/}]和[\){FILE_2##//}]文件内容不一致\033[0m"
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
echo "部分内容相同,详细内容如下>>> "
comm -1 -2 <(sort $FILE_1) <(sort $FILE_2) || ( echo "Comm -1 -2 执行失败" && exit E_CODE )
fi
}文本比较功能实现
txt_comm(){
#只显示FILE_1才有的内容
if [ \(1 == 1 ]
then
clear
echo -e "\033[42;37m仅在[\){FILE_1##//}]出现的内容\033[0m"
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
comm -2 -3 <(sort $FILE_1) <(sort $FILE_2) || ( echo "Comm -2 -3 执行失败" && exit E_CODE )
echo
#只显示FILE_2才有的内容
elif [ \(1 == 2 ]
then
clear
echo -e "\033[42;37m仅在[\){FILE_2##//}]出现的内容\033[0m"
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
comm -1 -3 <(sort $FILE_1) <(sort $FILE_2) || ( echo "Comm -1 -3 执行失败" && exit E_CODE )
echo
#显示共有内容
elif [ \(1 == 3 ]
then
clear
echo -e "\033[42;37m[\){FILE_1##//}]和[${FILE_2##//}]共同出现的内容\033[0m"
awk 'BEGIN{sum="";for(i=0;i<=30;i++){ sum=sum "="};print sum}'
comm -1 -2 <(sort $FILE_1) <(sort $FILE_2) || ( echo "Comm -1 -2 执行失败" && exit E_CODE )
echo
fi}
打印一级主菜单
menu_1(){
clear
cat<<EOF== Welcome to the file content verification script ===
1.Author:Cosann
2.Function:文件内容校验脚本
3.version:1.0
4.Email:gy17520659076@gmail.com
5.Description:
- 文件内容校验(是否一致内容)
- 定制化输出文本(1.仅文本单独出现内容;2.共同出现内容)
- 交互式便捷使用
======================================================
功能菜单:
1.校验文件内容一致性
2.查看文件详细内容
3.退出程序EOF
获取菜单选项序号
read -p "请输入菜单序号执行对应功能: " menu_nu
}打印二级菜单
menu_2(){
cat<<EOF1.显示仅在[\({FILE_1##/*/}]出现的内容
2.显示仅在[\){FILE_2##/*/}]出现的内容
3.显示两个共同出现的内容
4.返回主菜单EOF
获取菜单选项序号
read -p "请输入序号: " menu_nu2
}返回菜单
f_menu(){
echo
cat<<EOF
- 返回主菜单
- 退出程序
EOF
read -p "请输入序号>>> " menu_nu3
if [ $menu_nu3 -eq "1" ];then
continue
elif [ $menu_nu3 -eq "2" ];then
exit_menu
else
"非法输入,请输入正确序号!"
sleep 0.5
fi
echo
}退出信息
exit_menu(){
cat<<EOF感谢使用,再见~
EOF
exit
}控制函数
main(){
init
txt_check
while :
do
#打印主菜单
menu_1#菜单选项控制
case $menu_nu in
"1")
#echo "菜单选项1"
judge_comm
f_menu
;;
"2")
clear
while :
do
menu_2
case $menu_nu2 in
"1") txt_comm "1" ;;
"2") txt_comm "2" ;;
"3") txt_comm "3" ;;
"4") break ;;
*) echo "错误输入,请输入正确序号!";sleep 0.5 ;;
esac
done
;;
"3")
exit_menu
;;
*)
echo "非法输入,请输入正确序号!"
sleep 0.5
;;
esac
done
}main $*
运行案例
文本


运行程序

结果展示
文件内容校验

菜单选项

仅在某个文本出现的内容

两个文本共同出现的内容

[转帖]shell脚本实现文本内容比较交互程序的更多相关文章
- shell脚本--显示文本内容
shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...
- iOS使用shell脚本注入混淆内容
背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...
- shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中
shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...
- Shell脚本学习 - 基本内容以及数据格式
为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑.实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题.所以学习一下she ...
- [转帖]Shell脚本中的break continue exit return
Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...
- 如何把rc.local里执行的shell脚本的日志内容放到其他位置
rc.local的日志内容默认是/var/log/boot.log /etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把 ...
- 写个shell脚本搭载jenkins让你的程序部署飞起来
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html 作者:jstarseven 码字挺辛苦的..... 说明 ...
- shell脚本修改文本中匹配行之前的行的方法
原创文件,欢迎阅读,禁止转载. 例子中是把 finish 前一行的 "yes" 改成 "YES"有一个方法就是利用sed+awk一起来完成. zjk@zjk:~ ...
- shell 脚本中将输出内容赋值给一个变量时的换行问题
for ((i=0; i<4; i++) do ....... done 如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行 而使用 echo "$a ...
- shell脚本之删除内容相同的重复文件
#!/bin/bash #!当前文件夹下,删除内容相同的重复文件,只保留重复文件中的一个. ls -lS --time-style=long-iso | awk 'BEGIN{ getline;get ...
随机推荐
- Luogu P5515 [MtOI2019]灵梦的计算器
简化题意 给定三个实数 \(n, a, b\),求方程 \(\left \lfloor {x ^ a + x ^ b} \right \rfloor = \left \lfloor {n ^ a + ...
- Winform PictureBox图片旋转
Image img = this.pictureBox1.Image; img.RotateFlip(RotateFlipType.Rotate90FlipNone); this.pictureBox ...
- 在线编辑Word——插入表格
Word中可插入表格并进行相关格式化操作用于美化表格设计.本文,将通过使用Spire.Cloud Word在线编辑器展示如何来插入格式化的表格到Word.详细步骤见以下内容: 1. 进入在线编辑Wor ...
- SPL:跑批有这么难么?
摘要:SPL实现了更优算法,性能远远超过存储过程,能显著提高单机计算效率,非常适合跑批计算. 本文分享自华为云社区<Java开源专业计算引擎:跑批真的这么难吗?>,作者: Java李杨勇. ...
- 华为云GaussDB深耕数字化下半场,持续打造数据库根技术
摘要:华为云数据库CTO庄乾锋携华为云数据库多位技术专家和优秀合作伙伴共同参与DTCC2021大会并发表了重要主题演讲. 10月18日,以"数造未来"为主题的第12届中国数据库技术 ...
- 大银行数字化升级之后,火山引擎 VeDI 这次要把能力带给中小金融机构
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 数据技术是金融行业数字化转型的重要动力. 近年来,各大银行在全面推进数据技术建设上动作频频.比如,建设银行深化平台经营,依 ...
- Java SpringBoot Bean InitializingBean 项目初始化
Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的ge ...
- Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令
Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令 Jenkins插件安装 Publish over SSH 系统配置 生成代码 sshPublishe ...
- SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
MySQL 项目中 SQL 脚本更新.升级方式,防止多次重复执行 Oracle 项目中 SQL 脚本更新方式 一套代码,多家部署时,在SQL脚本升级时,通过一个SQL文件给运维,避免出现SQL执行序顺 ...
- ECS 挂载 OSS 多Bucket
ECS 挂载 OSS,等同于在ECS 上使用内网的 Bucket 域名,不需要收取流量费用,减少接口代码的编写. CentOS系统 安装 wget http://gosspublic.alicdn.c ...