背景介绍

脚本基于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. Luogu P5515 [MtOI2019]灵梦的计算器

    简化题意 给定三个实数 \(n, a, b\),求方程 \(\left \lfloor {x ^ a + x ^ b} \right \rfloor = \left \lfloor {n ^ a + ...

  2. Winform PictureBox图片旋转

    Image img = this.pictureBox1.Image; img.RotateFlip(RotateFlipType.Rotate90FlipNone); this.pictureBox ...

  3. 在线编辑Word——插入表格

    Word中可插入表格并进行相关格式化操作用于美化表格设计.本文,将通过使用Spire.Cloud Word在线编辑器展示如何来插入格式化的表格到Word.详细步骤见以下内容: 1. 进入在线编辑Wor ...

  4. SPL:跑批有这么难么?

    摘要:SPL实现了更优算法,性能远远超过存储过程,能显著提高单机计算效率,非常适合跑批计算. 本文分享自华为云社区<Java开源专业计算引擎:跑批真的这么难吗?>,作者: Java李杨勇. ...

  5. 华为云GaussDB深耕数字化下半场,持续打造数据库根技术

    摘要:华为云数据库CTO庄乾锋携华为云数据库多位技术专家和优秀合作伙伴共同参与DTCC2021大会并发表了重要主题演讲. 10月18日,以"数造未来"为主题的第12届中国数据库技术 ...

  6. 大银行数字化升级之后,火山引擎 VeDI 这次要把能力带给中小金融机构

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 数据技术是金融行业数字化转型的重要动力. 近年来,各大银行在全面推进数据技术建设上动作频频.比如,建设银行深化平台经营,依 ...

  7. Java SpringBoot Bean InitializingBean 项目初始化

    Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的ge ...

  8. Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令

    Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令 Jenkins插件安装 Publish over SSH 系统配置 生成代码 sshPublishe ...

  9. SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行

    MySQL 项目中 SQL 脚本更新.升级方式,防止多次重复执行 Oracle 项目中 SQL 脚本更新方式 一套代码,多家部署时,在SQL脚本升级时,通过一个SQL文件给运维,避免出现SQL执行序顺 ...

  10. ECS 挂载 OSS 多Bucket

    ECS 挂载 OSS,等同于在ECS 上使用内网的 Bucket 域名,不需要收取流量费用,减少接口代码的编写. CentOS系统 安装 wget http://gosspublic.alicdn.c ...