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

  • 相关阅读:
    poj 1321 棋盘问题 (DFS深度优先搜索)
    HDOJ1312 Red and black(DFS深度优先搜索)
    《数据结构》例1.3
    hdoj1905 Pseudoprime numbers (基础数论)
    百练4003 十六进制转十进制(水题)
    第二天——2.23
    第一天——2.22
    返校——2.21
    被盗号了——2.19
    继续咸鱼——2.18
  • 原文地址:https://www.cnblogs.com/bigbean/p/3661556.html
Copyright © 2011-2022 走看看