背景介绍
脚本基于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 $*
运行案例
文本