背景介绍

脚本基于Comm命令进行功能封装,考虑到命令执行前需要对文本进行排序,并且在多文件需要比较内容时可能会导致多个文本混乱,因此使用Shell封装成了一个交互式程序,快速对文件内容进行判断和输出想要的内容内容结果。

脚本介绍

  1. 文件内容校验(是否一致内容)
  2. 定制化输出文本(1.仅文本单独出现内容;2.共同出现内容)
  3. 交互式便捷使用

实现代码

!/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<<EOF

1.显示仅在[\({FILE_1##/*/}]出现的内容
2.显示仅在[\){FILE_2##/*/}]出现的内容

3.显示两个共同出现的内容

4.返回主菜单

EOF

获取菜单选项序号

read -p "请输入序号: " menu_nu2

}

返回菜单

f_menu(){

echo

cat<<EOF

  1. 返回主菜单
  2. 退出程序


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 $*

运行案例

文本


运行程序

结果展示

文件内容校验

菜单选项

仅在某个文本出现的内容

两个文本共同出现的内容

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览13915 人正在系统学习中

[转帖]shell脚本实现文本内容比较交互程序的更多相关文章

  1. shell脚本--显示文本内容

    shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...

  2. iOS使用shell脚本注入混淆内容

    背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...

  3. shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中

    shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...

  4. Shell脚本学习 - 基本内容以及数据格式

    为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑.实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题.所以学习一下she ...

  5. [转帖]Shell脚本中的break continue exit return

    Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...

  6. 如何把rc.local里执行的shell脚本的日志内容放到其他位置

    rc.local的日志内容默认是/var/log/boot.log /etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把 ...

  7. 写个shell脚本搭载jenkins让你的程序部署飞起来

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html    作者:jstarseven    码字挺辛苦的.....  说明 ...

  8. shell脚本修改文本中匹配行之前的行的方法

    原创文件,欢迎阅读,禁止转载. 例子中是把 finish 前一行的 "yes" 改成 "YES"有一个方法就是利用sed+awk一起来完成. zjk@zjk:~ ...

  9. shell 脚本中将输出内容赋值给一个变量时的换行问题

    for ((i=0; i<4; i++) do ....... done 如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行 而使用 echo "$a ...

  10. shell脚本之删除内容相同的重复文件

    #!/bin/bash #!当前文件夹下,删除内容相同的重复文件,只保留重复文件中的一个. ls -lS --time-style=long-iso | awk 'BEGIN{ getline;get ...

随机推荐

  1. 15、Flutter 按钮组件

    按钮组件的属性 ButtonStylee里面的常用的参数 ElevatedButton ElevatedButton 即"凸起"按钮,它默认带有阴影和灰色背景.按下后,阴影会变大 ...

  2. mac phpbrew安装

    php 编译安装php 7.2.26 aliyun 镜像中心:https://developer.aliyun.com/mirror/ 1.安装brew /usr/bin/ruby -e " ...

  3. 一图看懂华为云CodeArts Link六大特性

    本文分享自华为云社区<一图看懂华为云CodeArts Link六大特性,带你体验一站式跨平台数据互联>,作者:华为云PaaS服务小智 . 能够打破不同研发工具之间的壁垒,实现数据的无缝集成 ...

  4. 如何利用动态配置中心在JavaAgent中实现微服务的多样化治理

    本文分享自华为云社区<如何利用动态配置中心在JavaAgent中实现微服务的多样化治理>,作者:华为云开源 . 一.前言 随着JavaAgent在微服务治理方面的广泛应用和发展,我们可以在 ...

  5. Mock服务设计与实现:MySQL驱动字节码修改增强

    摘要:华为导流测试平台通过对线上流量回放到被测环境中,利用线上真实流量进行充分测试,保证业务系统稳定上线.但是业务在导流测试过程中现网数据库往往难以同步到测试环境,导致现网数据无法正常回放,测试价值降 ...

  6. 云图说|云上应用监控神器——应用性能监控APM2.0

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 应用性能管理服务 ...

  7. 总结vue3 的一些知识点:​Vue.js 条件语句​

    Vue.js 条件语句 条件判断 v-if 条件判断使用 v-if 指令: v-if 指令 在元素 和 template 中使用 v-if 指令: <div id="app" ...

  8. 火山引擎数智平台VeDI荣获虎啸奖“年度最佳智能营销平台”奖项

    近日,由中国商务协会数字营销专业委员会指导的第十四届虎啸奖正式公布获奖名单,火山引擎数智平台VeDI荣获技术平台/产品类奖项.   作为国内品牌营销领域兼具权威性.前瞻性以及创新性的赛事活动,第十四届 ...

  9. 火山引擎 DataTester:如何做 A/B 实验的假设检验

    A/B 实验的核心统计学理论是(双样本)假设检验,是用来判断样本与样本.样本与总体的差异是由 抽样误差 引起还是 本质差别 造成的一种统计推断方法. 假设检验,顾名思义,是一种对自己做出的假设进行数据 ...

  10. playwright codegen 录制生成

    Generating tests playwright codegen odegen在浏览器中运行并执行操作.Playwright 将为用户交互生成代码.Codegen将查看呈现的页面并找出推荐的定位 ...