美文网首页
02.用过的shell命令(整理中)

02.用过的shell命令(整理中)

作者: 笑着字太黑 | 来源:发表于2021-11-19 08:29 被阅读0次

    1.基本规则

    这里记录个人使用的规则,与通用规则可能有冲突的地方

    1.1.文件名使用[_]分割,函数名使用文件名+驼峰命名
    SHELL里面是不区分大小写的,命名规则通常时使用下划线分割,
    SHELL里面也没有命名空间的概念,
    导致划分文件规划代码的时候非常困难,
    目前想到的办法也只能是采用强行违反通用规则的命名方式来凑合着用
    

    1.2.全局常量,局部变量

    SHELL并没有常量,变量,全局,局部的概念,
    SHELL里面在任意文件任意位置定义的都是全局的
    这里也只是使用类似的机能强行划分一下

    1.2.1.全局常量,大写,使用_开头,readonly
    readonly _ABC='abc'
    
    1.2.2.局部变量,小写,local
    local abc='abc'
    
    1.3.函数内将收到的参数重新赋值(可读性)
    local XXX=$1
    local XXX=$2
    

    2.取得路径

    readonly current_path=$(
    cd $(dirname $0)
    pwd
    )
    

    3.引入文件

    source ${current_path}/../config/con.env
    source ${current_path}/../lib/lib1.sh
    

    4.大写转小写

    readonly LLETTER=$(echo ${XXX} | tr '[A-Z]' '[a-z]') 
    

    5.写文件

    5.1.覆盖(>)
    "XXXX" > [file]
    
    5.2.追加(>>)
    "XXXX" >> [file]
    

    6.文件内容置换

    注意特殊字符需要转义
    比如代码中的[replace_org]
    是因为[和]是特殊字符,所以进行了转义
    实际是将文件中的[replace_org],替换为变量${replace_target}的值

    sed -i "s#\[replace_org\]#${replace_target}#" ${repalce_file}
    

    7.删除空行

    sed -i "/^$/d" ${OUTPUT_FILE_PATH_PASSPORT}
    

    8.if判断

    8.1.数值比较

    -eq等于,对应的其他英文缩写还有比如以下:
    大于等于-ge
    大于-gt

    if [ ${XXX} -eq 0 ]; then
    else
    fi
    
    8.2.字符串比较

    一个等号好像跟两个等号是一样的,
    不喜欢使用一个等号,因为容易跟赋值混淆,
    没有详细测试过

    if [ “${XXX}” == “XXX” ]; then
    else
    fi
    

    9.多行字符串赋值

    sql=$(cat<<EOF
                sql1;
                sql2;
    EOF
    )
    

    10.删除文件中的CR(\r)

    sed -i 's/\r//' ${file_path}
    

    11.读取CSV文件

    local index=1
    cat ${CSV_PATH} | while read line
        do
            #跳过一行
            if [ ${index} -ge 2 ]; then
                #取得逗号分割的第一列
                local col1=$(echo ${line} | awk -F"," '{print $1}')
                #通过取得的第一列的值查找${IMG_PATH} 目录下的文件
                local file_name="$(find ${IMG_PATH} -type f -name "${cole}\.*")"
                if [ ! $file_name ]; then
                    local mime_type=""
                else
                    #取得文件的mime-type
                    local mime_type="$(file --mime-type -b ${file_name})"
                fi
                #取得文件名(去掉路径)
                file_name=$(basename ${file_name})
                #在${CSV_PATH}文件对应行的末尾追加${file_name},${mime_type}
                sed -i "${index},${index}s#\$#&,${file_name},${mime_type}#" ${CSV_PATH}
            fi
            let index+=1
        done
    

    12.遍历目录中所有文件

        for temp_file in ${path}/*
        do
        done
    

    13.取得前一行语句执行结果

        #処理結果
        RC=$?
        if [ $RC -eq 0 ]; then
            #正常终了
        else
            #异常终了
            exit $RC
        fi
    

    14.判断文件第二行逗号数量

    local line2=$(sed -n 2p ${temp_file})
    local commaCount=$(echo ${line2} | awk -F',' '{print NF-1}')
    if [ ${commaCount} -ge 2 ]; then
        #File Type A
    else
        #File Type B
    fi
    

    15.数值整形

    不足三位前面补零

    local id03d=$(printf "%03d" "${id}")
    

    16.查找文件中指定字符串开头的行

    查找SearchContent开头的行,并解析逗号分割的第二列值,赋值给value

    local value=$(cat ${CSV_PATH} | grep ^SearchContent.* | awk -F"," '{print $2}')
    

    17.LF转CRLF

    #LF转CRLF
    sed -i ':a;N;$!ba;s/\n/\r\n/g' ${FILE_PATH}
    #末尾如果有LF的话上面命令转换不了,使用下面命令直接吃掉
    truncate -s -1 ${OUTPUT_FILE_PATH_ACTIVENGLIST}
    

    18.取得毫秒时间

    start=$[$(date +%s%N)/1000000]
    date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23
    

    19.置换文件内容

    sed -i "s/${KEY_TARGET}/${REPLACE}/" ${file}
    

    20.数组遍历的几种方式

    首先创建一个数组 array=( A B C D 1 2 3 4)

    20.1.标准的for循环
    for(( i=0;i<${#array[@]};i++)) do
    echo ${array[i]};
    done;
    
    20.2.for … in

    遍历(不带数组下标):

    for element in ${array[@]}
    #也可以写成for element in ${array[*]}
    do
    echo $element
    done
    

    遍历(带数组下标):

    for i in "${!arr[@]}";   
    do   
        printf "%s\t%s\n" "$i" "${arr[$i]}"  
    done 
    
    20.3.While循环法:
    i=0  
    while [ $i -lt ${#array[@]} ]  
    do  
        echo ${ array[$i] }  
        let i++  
    done
    

    21.grep +正则表达式

    -P:使用正则表达式
    -o:取得匹配部分,不加-o取得包含指定字符串的一行数据

    split_str() {
        local str="14d3h5m2s"
        local h=$(echo ${str} | grep -Po "\d+d")
        echo ${h}
    }
    

    22.CURL

    local start_date=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)
    res=`curl -S --stderr curl.log -X POST -k [url] \
              -H "Content-Type: application/json" \
              -H "XXX: xxx" \
              -d '{
                    "XXX":"xxx", 
                    "XXX":"xxx"
                  }'`
              
    local end_date=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)
            
    local start_ms=$[$(date -d "${start_date}" +%s%N)/1000000]
    local end_ms=$[$(date -d "${end_date}" +%s%N)/1000000]
    let rsp_time=${end_ms}-${start_ms}
            
    contain_result=$(echo $res | grep "XXX")
    if [[ -z $contain_result ]]
    then
        error_log=$(grep -o "curl.*" curl.log)
        echo "XXX"
    fi
    

    23.no hang up与后台运行&

    nohup sh test.sh  & 
    

    查看程序PID

    ps -ef | grep test
    

    杀死进程

    kill -9 进程号
    

    查看占用某端口的进程

    netstat-tln|grep+被占端口。
    lsof-i:+被占端口
    netstat -ap|grep +被占端口

    24.判断数组中是否存在某个值

    echo "${XXX_NAME_LIST[@]}" | grep -wq "${XXX_NAME}"
    RESULT=$?
    case ${RESULT} in
    #XXX_NAME_LIST中存在XXX_NAME
    0)
        #do something
        ;;
    #XXX_NAME_LIST中不存在XXX_NAME
    *)
        #do something
        ;;
    esac
    

    25.接收YYYYMMDD格式的输入值

    while read -p "XXXDate(YYYYMMDD):" xxxDate
    do
        if [[ ${xxxDate} =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]]; then
            break
        else
            echo "Pls input date with YYYYMMDD format"
        fi
    done
    

    26.echo 输出时不换行

    echo -e "XXXX\c"
    

    27.echo grep结果时保持换行效果

    换行效果是受到echo影响的,grep结果里面是保留有换行符的

    grepResult=$(grep -h "[grep content]" [file name(文件名中可以使用*)])
    
    #输出有换行效果
    echo "${grepResult}"
    
    #输出无换行效果
    echo ${grepResult}
    

    28.变量名做Key名

        #注意这里定义数组需要使用双引号而不是小括号
        VALUE_LIST_KEYXXXX="value1 value2"
    
        keyName="KEYXXXX"
        valueList=`eval echo '$'VALUE_LIST_${keyName}`
    
        echo "ValueList1:${valueList}"
        echo "ValueList2:${valueList[@]}"
        for value in ${valueList[@]}
        do
            echo "VALUE: ${value}"
        done
    

    29.数组内容太长时折行

    NAME_LIST=(
      0001 0002 0003 0004 0005
      0030 0031 0032 0033
    )
    

    30.逐行遍历grep文件后的多行结果

    grep -E -o -h "${_GREP_KEY}" ${_FILE} | while read -r line; do
        echo ${line}
    done
    

    相关文章

      网友评论

          本文标题:02.用过的shell命令(整理中)

          本文链接:https://www.haomeiwen.com/subject/oavdtrtx.html