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)(.*)/\1\2 ;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在脚本中使用正则表达式
\1\2即表示前面的(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\n$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"\t"$2"\t"$4}' >>last.txt
done
for b in `awk '{if ($1==1) print $2}' tmp`
do
echo `cat file1 file2 |grep $b` | sed 's/|/\t/g' >>last.txt
done
rm -f tmp
简单的:
join -a 1 -a 2 -t "|" file* |sort -t"|" -rk3 |awk -F'|' '{print $1"\t"$2"\t"$3$4}'


11,字母分离
将abcdefghijklmnopqrstuvwxy分离成为:
abcde
fghij
klmno
pqrst
uvwxy
用到sed配合正则表达式:
sed 's/\(.....\)\(.....\)\(.....\)\(.....\)\(.....\)/\1\n\2\n\3\n\4\n\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

posted on 2014-04-12 23:10  mybloges  阅读(433)  评论(0编辑  收藏  举报

导航