shell脚本实现文本内容比较交互程序

14 篇文章 0 订阅

背景介绍

脚本基于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 $*

运行案例

文本

image.png
image.png

运行程序

image.png

结果展示
文件内容校验

image.png

菜单选项

image.png

仅在某个文本出现的内容

image.png

两个文本共同出现的内容

image.png

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值