zoukankan      html  css  js  c++  java
  • Shell练习

    1.找出test目录下小于100k和大于300k的文件
    # !/bin/sh
    ls -l /tmp/test/ |awk '{print $9}' |grep -v ^$ | while read LINE
    do
    size=`ls -l /tmp/test/$LINE |awk '{print $5}'`
    if [ $size -le 100 -o $size -ge 300 ];then
    #mv $LINE /tmp
    echo $LINE
    fi
    done
    或:
    find /tmp -size -100k -o -size +300k -exec ls -l {} ;

    2.找出test目录下大小在40K-60K之间的文件
    find test -size +40k -a -size -60k -exec ls -l {} ;


    3、在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。
    #!/bin/sh
    cd /tmp
    for i in `find . -type f -name "abc*"| head -n 100`
    do
    head -n1 $i>>new
    done


    4、把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。
    # !/bin/sh
    for i in `cat b`
    do
    grep $i a                     #将b中的行,在a中查找
    if [ "$?" -gt "0" ];then      #如果结果大于0(即为找不到)
    echo $i>>c                    #将此行输入到c中
    fi
    done
    统计行数wc -l即可~

    这个不对,但是先保留着吧~
    排除重复的,再用cut,已1为分隔域,打印出第二域到最后一域
    cat b a | sort -n |uniq -c | awk '{if ($1==1) print $0}'|cut -f2- -d "1" | wc -l
    另外 uniq -u就可以打印出不重复的。

    5.实现从1加到100,得出结果:
    一:
    #!/bin/sh

    i=1
    sum=0
    while [ $i -le 100 ]
    do

           sum=`expr $sum + $i`
            i=`expr $i + 1`
    done
    echo $sum

    二:
    i=1
    b=0
    for i in {1..100}
    do
            b=$[$b + $i]
    done
    echo $b

    三:
    # !/bin/sh
    s=0
    for((i=1;i<101;i++));do
    s=`expr $s + $i`
    done
    echo $s

    四:
    # !/bin/sh
    i=1
    num=0
    while [ "$i" != "101" ]
    do
    num=`expr $i + $num`
    i=`expr $i + 1`
    done
    echo $num


    6,文件内容为
    admin: aa@test.com
    body: bb@test.com
    admin: cc@test.com 
    把匹配admin 的行后面加上 ;aa@163.com 
    sed -r 's/(admin)(.*)/12 ;aa@163.com/g' filename
    admin: aa@test.com ;aa@163.com
    body: bb@test.com
    admin: cc@test.com ;aa@163.com

    -r, --regexp-extended       

    use extended regular expressions in the script.
    -r 使sed在脚本中使用正则表达式
    12即表示前面的(admin)(.*)

    7,文件内容为:
    1 aaa 1000
    2 bbb 1000
    3 aaa 1000
    4 aaa 1000
    5 ccc 1000
    6 bbb 1000
    将其变成:
    1 aaa 3000
    2 bbb 2000
    5 ccc 1000
    脚本:
    # !/bin/sh
    for i in `awk '{print $2}' filename |sort|uniq`
    do
    grep $i filename >$i.txt
    sum=`awk '{tot+=$3}; END{print tot}' $i.txt`
    three=`sed -n '1p' $i.txt |awk '{print $3}'`
    sed -i "s/$three/$sum/g" $i.txt
    head -n1 $i.txt >>last
    rm -f $i.txt
    done

    8,文件内容:
    this
    is
    a
    test
    script
    将其变成:
    this is a test script
    脚本:
    echo `cat filename`

    9,比较字符串大小(主要是用到了sort来比较)
    VAR1=abc
    VAR2=def
    tt=`echo -e "$VAR1 $VAR2"|sort|head -1`
    if [ "$tt" = "$VAR1" ];then
    echo $VAR1 relatively large!
    else
    echo $VAR2 relatively large!
    fi

    10.合并相同项
    [root@test1 tmp]# more file1
    DAD|15.0|
    JAB|2.0|
    JAH|55.0|
    HAH|11|
    [root@test1 tmp]# more file2
    DAD|773.0|
    GGC|2.0|
    JAB|224.0|
    HOH|22|
    将其合并成:
    DAD     15.0    773.0
    JAB     2.0     224.0
    GGC     2.0
    HOHO    22
    JAH     55.0
    脚本:(感觉写的有点笨了)
    # !/bin/sh
    cat file1 file2 |awk -F'|' '{print $1}'| sort |uniq -c >tmp

    for i in `awk '{if ($1 >=2) print $2}' tmp`
    do
    echo `cat file1 file2 |grep $i` | awk -F'|' '{print $1" "$2" "$4}' >>last.txt
    done
    for b in `awk '{if ($1==1) print $2}' tmp`
    do
    echo `cat file1 file2 |grep $b` | sed 's/|/ /g' >>last.txt
    done
    rm -f tmp
    简单的:
    join -a 1 -a 2 -t "|" file* |sort -t"|" -rk3 |awk -F'|' '{print $1" "$2" "$3$4}'


    11,字母分离
    将abcdefghijklmnopqrstuvwxy分离成为:
    abcde
    fghij
    klmno
    pqrst
    uvwxy
    用到sed配合正则表达式:
    sed 's/(.....)(.....)(.....)(.....)(.....)/1 2 3 4 5/' filename

    12.每隔5秒检测另一台服务器上的apache服务,直到其启动后,echo OK
    # !/bin/sh
    echo | telnet 192.168.2.189 80 >check.txt
    grep -i connected check.txt
    while [ $? -ne 0 ]         #如果上面grep的结果不为0
    do
    echo no
    sleep 5
    echo | telnet 192.168.2.189 80 >check.txt
    grep -i connected check.txt
    done
    echo OK!!!!!!!!!!!

    13.在/tmp/下建0-255目录,再每个目录再建0-255个目录,然后在最下级目录下面建100个文件
    原来写的:
    for ((i=0;i<255;i++));do
    mkdir -p $i
    for ((b=0;b<255;b++));do
    mkdir $i/$b
    for ((c=0;c<100;c++));do
    touch $i/$b/$c
    done
    done
    done
    接下来看一个超简单的:建5个目录,再每个目录再建5个目录,然后在最下级目录下面建5个文件
    mkdir -p {0..5}/{0..5} && touch {0..5}/{0..5}/{0..5}

    14.记录sed的一个用法:
    i=1
    sed s/2/$i/g file   不需要写成 sed 's/2/$i/g' file
    这样的好处就是可以使用变量了

    原文: http://hi.baidu.com/ggb98/blog/item/eabebfee930fd3ffcf1b3eee.html

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/bigbean/p/3661556.html
Copyright © 2011-2022 走看看