• 两个shell实用函数:icd和mgrep


    这里介绍两个我写的shell实用函数,有了它们就可以更方便地进行shell编程了。

    1. icd函数

    需求:当别人共享给自己一个文件时,我不想直接查看该文件,而是想进入到该文件所在的目录去查看,因为还需要查看该目录下面的很多东西,那么要进入该文件所在的目录需要将文件名删除,然后进去,但当路径和文件名很长的时候,挨个字符删除文件名也比较麻烦,因此写了一个类似cd的函数,可以进入文件所在的目录下面,同时该函数也具备cd的功能。

    实现的功能:该函数命名为icd(integrated cd),接收一个参数,若参数是一个文件,那么就进入到该文件所在的目录,若参数是一个目录,则进入到该目录,若参数是-,则进入到上一级目录(此用法同cd

    该函数的实现代码如下

    function icd(){
        # my_cd: 
        if [[ $# -eq 0 ]]; then
            echo "Usage: icd [ dir | file ] "
            echo "icd means integrated cd"
            return 1
        fi
    
        dir_or_file=$1
    
        if [[ $dir_or_file == "-" ]]; then
            cd -
        elif [[ -d $dir_or_file ]]; then
            # echo "dir"
            cd $dir_or_file
        elif [[ -f $dir_or_file ]]; then
    				filedir=$(dirname $dir_or_file)
            cd $filedir
        else
            echo "Error! Wrong input! Must be a dir or a file"
        fi
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    将上述代码保存到一个bash脚本(我保存在了utils.sh文件里面)中,然后在shell或终端执行source utils.sh,就可以调用该函数了。

    icd函数用法示例

    # 查看函数用法
    icd
    
    mkdir /tmp/adir # 新建一个目录
    mkdir /tmp/bdir # 新建另一个目录
    touch /tmp/adir/afile # 新建一个空文件
    
    icd /tmp/adir/afile # 进入到该文件所在的目录
    icd /tmp/bdir # 进入到bdir目录
    icd - # 返回上一次所在目录
    icd . 
    icd .. # 进入上一级目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2. mgrep函数

    需求:在shell中使用grep搜索多个内容的时候比较麻烦,比如我想在文件a.txt中搜索python和linux,那么需要这样写:grep -E 'python|linux' a.txt,当要搜索多个关键字时就要打很多个|符号,有些麻烦,因此决定写一个简单的函数来更方便地对多个关键词进行搜索。

    实现的功能:写了一个函数mgrep(my grep的缩写),使用该函数在文件中搜索多个关键字的用法如下:

    mgrep text1 text2 ... file.txt # 每个关键字用空格分隔,待搜索的文件放在最后面
    
    # 原来的grep代码
    grep -E 'python|linux' a.txt
    
    # 使用mgrep搜索
    mgrep python linux a.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    该函数的实现代码如下

    其实实现起来并不难,代码主要做的工作是对输入文本进行处理,将其整理成 grep -E 'A|B' 的形式,然后使用grep去搜索。

    function mgrep(){
        if [ $# -eq 0 ]; then
            echo "Usage: mgrep text1 text2 ... target_file "
            return
        fi
        
        num_args=$#
        
        # return 0
        search_text=""
        num=0
        for text in $@
        do
            num=$((num+1))
            if [[ $num -ne $num_args ]]; then
                search_text=$search_text"|"$text
            else
                target_file=$text
            fi
        done
    
        search_text_final=$(echo $search_text | sed 's/|//' ) # 将第一个|去掉
    
        # echo "text is $search_text_final, target_file=$target_file"
        grep -E $search_text_final $target_file
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    同样,将上述代码保存到bash脚本(我保存在了utils.sh文件里面)中,然后在shell或终端执行source utils.sh,就可以调用该函数了。

    分享结束

    以上就是本次分享的icdmgrep函数的简单用法,如果你有什么好的建议欢迎指出,我们一起进步。

  • 相关阅读:
    程序员自由创业周记#35:外包、技术选型和卖房
    阿里首推的“SpringBoot+Vue全栈项目”有多牛X?
    mybatis循环插入
    软件工程:帕金森定律,项目工期的那点事儿
    达梦更换正式授权dm.key
    JAVA学习第十一课:java绘图
    回溯算法的基本思想
    【无标题】
    【CSS】自定义进度条
    【Linux】Linux操作系统
  • 原文地址:https://blog.csdn.net/weixin_44843824/article/details/125900568