[转帖]shell脚本实现文本内容比较交互程序

shell,脚本,实现,文本,内容,比较,交互,程序 · 浏览次数 : 0

小编点评

控制函数main(){inittxt_checkwhile : 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 ;;esacdone}main $* 运行案例 文本 运行程序 结果展示 文件内容校验 菜单选项 仅在某个文本出现的内容 两个文本共同出现的内容

正文

背景介绍

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

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

    与[转帖]shell脚本实现文本内容比较交互程序相似的内容:

    [转帖]shell脚本实现文本内容比较交互程序

    背景介绍 脚本基于Comm命令进行功能封装,考虑到命令执行前需要对文本进行排序,并且在多文件需要比较内容时可能会导致多个文本混乱,因此使用Shell封装成了一个交互式程序,快速对文件内容进行判断和输出想要的内容内容结果。 脚本介绍 文件内容校验(是否一致内容)定制化输出文本(1.仅文本单独出现内容;

    [转帖]在KingbaseES数据库中批量创建数据库/表

    1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,shell脚本实现时内容如下: user=system #用于配置数据库的用户名 port=54587

    [转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

    前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。 结合Shell Script实现自动和

    [转帖]linux将大目录等分切割成多个小目录

    https://www.jianshu.com/p/6f9e6743a1dc 需求:有一个目录存放了数十万个文件,现在需要将这个目录上传,如果整个目录上传,中间因为某些故障断开连接了,可能又要从头开始 这时就需要将目录切割成多个小目录,分批次上传,一个简单的 shell 脚本即可实现 思路很简单:遍

    [转帖]linux将大目录等分切割成多个小目录

    https://www.jianshu.com/p/6f9e6743a1dc 需求:有一个目录存放了数十万个文件,现在需要将这个目录上传,如果整个目录上传,中间因为某些故障断开连接了,可能又要从头开始 这时就需要将目录切割成多个小目录,分批次上传,一个简单的 shell 脚本即可实现 思路很简单:遍

    [转帖]连shell的基本输出都不会,还写什么脚本?echo和printf命令总结

    https://zhuanlan.zhihu.com/p/438957797 在 Linux 系统中使用 echo 命令和 printf 命令都可以实现信息的输出功能,下面我们分别看这两个命令的应用案例。 echo 1.使用 echo 命令创建一个脚本文件菜单功能描述:echo 命令主要用来显示字符

    [转帖]分享自己做的一个指定进程以及线程长时间cpu监控的工具

    https://cdn.modb.pro/db/329601 前言: 前面给大家分享过一个工作中用到的编译拷贝脚本,其实工作中还有一些其他工具的使用,今天再来分享一个自己纯手工的CPU监控的脚本。大家可以结合上篇文章与本篇文章一起学习shell。 主要实现功能: 1.监控指定进程是否运行 2.读取该

    [转帖]shell脚本之awk命令——按列求平均值、最大值、最小值

    文章目录 写在前面awk求平均值awk求最大值awk求最小值awk求极值、均值的实际应用 写在前面 awk命令求极值和均值需要熟悉该命令的基本用法,如果你不熟悉该命令,请先阅读shell脚本之awk命令——分隔符介绍一文。本篇博文带你熟悉求平均值、最大值、最小值的方法,并以实际的应用带你进一步掌握a

    [转帖]BASH编写入门与实例

    1 2 3 4 5 6 7 8 9 10 怎么写shell脚本: 。使用任何编辑工具编写shell脚本 例如vi -#!/bin/bash #在第一行放置头格式说明 -#!/usr/bin/gawk //awk需要添加的头格式,让系统知道用什么方式去解析此文件 -#!/usr/local/bin/p

    [转帖]Shell 脚本实现应用服务日志入库 Mysql

    今天给大家分享一个 shell 脚本工具,通过 shell 脚本与 mysql 的结合,将某个具体服务的错误输出日志入库到指定的 mysql 表中,以便于进行错误问题的定位与分析。 日常工作中,经常需要和 linux 系统打交道,例如:服务部署、日志和服务状态查看等,而 shell 脚本是和 lin