shell 常见操作笔记

一、字符串

1、去除字符串中包含的空格

  • echo ${str// /}
  • echo $str | sed 's/ //g'
  • echo $str | tr -d " "

    2、判断一个字符串是不是以字母开头(大写或小写)

    ret_v=`echo "_dfsdf122" | grep "^[a-z,A-Z]"`
    echo ${#ret_v} #如果输出结果大于0,表示字符串是以字母开头的

    3、获取一个字符串中以某个分隔符隔开的第几个字段

         比如str1="abc,abd,hh,dd,ee"

        ret=`echo "${str1}" | awk -F ',' '{print $4}'`

        echo $ret

       则输出dd

    4、获取用分隔符分割后的最后一个词

       echo “eth0” | awk -F "[a-z]" '{print $NF}'

       这里输出0。

      echo "e,ch0" | awk -F "," '{print $(NF)}' #输出ch0

      echo "e,ch0" | awk -F "," '{print $(NF-1)}' #输出e

    二、date获取时间值

    time_one_month_ago=`date -d "1 month ago" +%s`  #获取一个月前的时间值

    newday=`date +%Y%m%d`
    tt_date=`date --date="${newday} 6 month" +%Y%m%d` #获取当前日期后半年的日期

     

    三、文件操作

    查找当前目录下包含指定字符串的文件

    grep -R "abc" ./

    四、shell数据组定义与操作

    order_by_column_list=("abc" "ddd" "dfd" "fdf")

    取值:

    第一个元素

    ${order_by_column_list[0]}

     

    五、修改文件中某个变量对应的值

    source "/tmp/global_var_define_file"

    #自动更新统计开始时间

    #变量值为stat_begin_time=2012-11-01
    onemonth_interval=`date -d "${stat_begin_time} 1 month" +%Y-%m-%d`
    today_date=`date +%Y-%m-%d`
    echo "$today_date"
    target_stat_begin_time="${stat_begin_time}"
    if [ "${onemonth_interval}"x = "${today_date}"x ]; then
            echo "equal"
            sed -i "/stat_begin_time/s/${stat_begin_time}/${onemonth_interval}/" "/tmp/global_var_define_file"
            target_stat_begin_time="${onemonth_interval}"
    fi

    #如果当前日期为2012-12-01,则/tmp/global_var_define_file文件中变量值被修改,stat_begin_time=2012-12-01
    #当此时通过调用${stat_begin_time}获取的值依然为2012-11-01,下次获取时生效

    val_someday=`date --date="${target_stat_begin_time}" +%s`
    echo "${val_someday}"

     

    六、查找子串

    string="abcd你好 "
    substr="ce你好 "

    ret=`echo ${string} | grep $substr`
    echo ${#ret} #如果长度为0,表示substr不在string中,否则,echo $ret输出string
    echo $ret

     

    七、清空文件内容

    cat /dev/null > test.txt

     

    八、查看监听端口的程序

         netstat -tnlp

        locate filename

     

    九、查看操作系统是多少位

    1、命令:getconf LONG_BIT

    显示:32或64

    2、命令:echo $HOSTTYPE

    显示(诸如):i686或x86_64

    3、命令:uname -a

    显示(诸如):Linux 2.6.18-238.el5PAE #1 SMP Thu Jan 13 17:10:20 EST 2011 i686 i686 i386 GNU/Linux

    或Linux 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

     

    十、locate查找文件

    通过locate查找文件,如果没找到,可能是由于索引还没有建立,执行sudo updatedb来更新索引,然后再执行locate


    十一、计算文件中包含某匹配字符串的所有行和、行数

    cat abc.txt |grep "xx cost time" | awk '{print $NF}' | awk '{sum+=$1}END{print sum}' 

    cat abc.txt |grep "xx cost time" | awk '{print $NF}' | awk '{sum+=1}END{print sum}'

    # 所以满足条件的行最后一列数值和,总数,平均值

    cat abc.txt |grep "xx cost time" | awk '{print $NF}' | awk '{sum+=1;num+=1}END{print sum,num,sum/num}'

    十二、mysql读取的多行结果,在变量里处理

    #!/bin/bash


    mysql="/usr/bin/mysql -h10.1.1.110 -uroot -p123456 test -N -e "


    tmp_val=`${mysql} "select name from db1.table1"`

    for str in ${tmp_val}
    do
      echo ${str}
    done


    十三、浮点数比较

    close_slippaged=0
    close_slippaged=`echo "$1 - $2 == 0.0"|bc -l`
    if [ ${close_slippaged} -eq 1 ];then
      echo "$1 equal $2"
      exit;
    fi


    十四、字符编码转换

    title=`echo "${title}" | iconv -f gbk -t utf8`


    十五、批量注释

    :<<MULTILINECOMMENT
    ...注释的内容
    ...注释的内容
    MULTILINECOMMENT

    这里的MULTILINECOMMENT可以随意取名


    十六、文件内容反转

    111.dat内容为

    abc

    def

    ghi

    tac 1111.dat > 222.dat

    则222.dat内容为

    ghi

    def

    abc


    十七、大文件分割为小文件

    split -l 20000 sourcefile.dat smallfile

    将文件sourcefile.dat内容分割为每个文件最多20000 行的小文件,文件名以smallfile开头


    十八、计算文件行数

    wc -l filename


    十九、列出目录下所有文件的文件名

    files=`ls -l | grep "smallfile" | awk '{print $NF}'`


    二十、杀掉包含某个关键字的所有进程

    ps -ef|grep “keyword”|grep -v grep|cut -c 9-15|xargs kill -9

  • 你可能感兴趣的:(shell 常见操作笔记)