shell用法总结

updating

总结一下,方便用的时候copy。不一定全,但都是自己用过的。


  1. 杂七杂八
  2. awk命令
  3. sed命令
  4. 参考资料


1 杂七杂八

我一般用这个来检测nohup.out文件是否有错误.

grep -i -E -w '(exception|fail.*|error|bug|404)' --color=auto

shell中的数学运算方式

1. c =`echo "$a+$b"| bc`
2. echo "$[1*10]"
3. echo "$[34/10]"
4. result=$(($value_a - $value_b))

判断文件后缀

    file=test.cpp
    if [ "${file##*.}" = "h" ];then
            echo for .h file

        elif [ "${file##*.}" = "cpp" ];then
            echo for .cpp file
    fi  

for循环和索引

    count=0
    for value in ${array[@]}
    do
        count=`expr $count + 1`
    done

获取CPU型号

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq | awk -F @ '{print $1}' | sed 's/^ *//

获取CPU频率

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq | awk -F @ '{print $2}' | sed 's/^ *//'

物理CPU和core数

echo $(($(cat /proc/cpuinfo | grep physical\ id | awk '{print $4}' | tail -1) + 1)) #物理CPU个数
echo $(($(cat /proc/cpuinfo | grep processor | awk '{print $3}' | tail -1) + 1)) #core数

while循环,注意while循环里的有些语句会吞掉文件的内容

    exec 3 < value.txt
    while read line <&3
    do
        echo $line
    done

case语句示例

case $value in
test1)
    echo test1;;
test2)
    echo test2;;
*)
    echo default;;

数组长度

echo ${#array[*]}

大小写转换

echo TEST | tr "[:upper:]" "[:lower:]" #将大写转成小写
echo test | tr "[:lower:]" "[:upper:]"  #将小写转成大写

date获取多天(分钟,年)前的时间

date -d "5 days ago" "+%Y-%m-%d %H:%M:%S" #五天以前
date -d "5 minutes ago" "+%Y-%m-%d %H:%M:%S" #五分钟以前
date -d "5 years ago" "+%Y-%m-%d %H:%M:%S" #五年以前

date获取当前时间的unix时间戳

date '+%s'

将变量值作为变量名

array=(UVMBJ UVMJH)
for i in ${array[*]}
do  
    eval echo \${$i}
done

将多行输出按规则合并成一行

cat t.txt | paste -s -d\| -

2 awk命令

awk中的遍历和match函数

    awk '{
        for (i = 1; i <= NF; i++) 
            if (match($i,/obj=[0-9]/)) 
                printf("%s\n",$i);
            else 
                printf("%s ",$i)
    }' value.txt

处理指定的行(例子中是第三行)

awk 'NR==3 {print $1}' value.txt

一个包括开始和结束的常用awk程序,可以将awk中的变量导出到shell

    value= eval $(
      awk 'BEGIN {
             print "begin"
             awk_value1=0
             awk_value2=0
          }
          {
          for(i=1;i<=NF;i++){
              awk_value1++;
              awk_value2++;
          }
          }
          END{
              printf("va0=%d;va1=%d", awk_value1, awk_value2);
          }
          ' $file 
     )
     sum=`echo "$va0+$va1"|bc`

删除字符串中的下划线,并将首字母换成大写

RemoveUnderscore(){
    local name=$1; shift 1                                                                                                                            
    echo $name | awk -F _ '{
        for(i=1;i<=NF;i++){
            printf("%s%s",toupper(substr($i,0,1)),substr($i,2,length($i)-1));
        }}'
}

查看连接数等

netstat -an | awk '/^tcp/ {++s[$NF]} END {for(a in s) print a, s[a]}'

3 sed命令

交换匹配的两行的内容

    $ cat value.txt 
    LINE1
    LINE2
    $ sed -i '/LINE1/{h;d};/LINE2/{G}' value.txt
    $ cat value.txt 
    LINE2
    LINE1

去掉行首的空格和shift

sed -i 's/^[[:space:]]*//' value.txt

去掉行尾的空格和shift

sed 's/[ \t]*$//g' value.txt

在行首插入

sed 's/^/hello /g' value.txt

在行尾插入

sed 's/$/ hello/g' value.txt

按顺序合并所有行

    $ cat value.txt 
    LINE1
    LINE2
    LINE3
    $ sed -i ':a;N;s/\n//;ba;' value.txt
    $ cat value.txt 
    LINE1LINE2LINE3

xml中的一个正则替换

sed 's/[0-9]*<\/id>/0000<\/id>/'

删除匹配行的下一行

$ cat value.txt 
LINE1
LINE2
$ sed '/LINE1/{n;d}' value.txt 
LINE1

在匹配行前插入一行

sed -i '/\/sbin\/service network restart/i  \/sbin\/service NetworkManager stop' value.txt

在匹配行后插入一行

sed -i '/\/sbin\/service network restart/a  \/sbin\/service NetworkManager stop' value.txt

在第一行前插入一行

sed -i '1 i\test test' value.txt

注释匹配行

sed -i '/value/s/.*/#&/' value.txt #注释包含value单词的行

参考资料