shell 脚本样例

1  解压文件,移动文件,删除特定目录

#!/bin/bash
pa=$(cd `dirname $0`; pwd) //获得当前目录的绝对路径
v_dir=${pa}"/"$1
mkdir ${v_dir}
dirDist=${v_dir}"/utxt/soft/eventd_bej/backup"
echo "pa= "${pa}
echo "v_Dir= "${v_dir}
echo "dirDist= "${dirDist}
tar -zvxf $1".tar.gz" -C ${v_dir}
mv  `find ${dirDist}"/" -name "*o"` ${v_dir}"/"
rm -rf ${v_dir}"/utxt/"

 

2 文本操作工具

 

sed  修改和编辑文本文件中的某些行
awk  访问和操作某些数据
grep 搜索

 

#!/bin/bash

# KpiAggregator run script(mainly for crontab)
# author: Alfred
# created: 2015/08/31
# history:
#   2015/08/31 - add sourcing /etc/profile and ~/.bash_profile to solve crontab env problem

. /etc/profile
. /home/sms/.bash_profile

v_dir=$(dirname $0)
v_basename=$(basename $0 .sh)
v_logname=${v_dir}/${v_basename}

# parameters
v_topo_index=$(echo $v_basename | awk -F'_' '{print $3}')
v_redis_url=$(grep "^${v_topo_index}.redis.url" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)
v_db_driver=$(grep "^${v_topo_index}.db.driver" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)
v_db_url=$(grep "^${v_topo_index}.db.url" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)
v_db_user=$(grep "^${v_topo_index}.db.user" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)
v_db_password=$(grep "^${v_topo_index}.db.password" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)
v_monitor_time=$(grep "^${v_topo_index}.monitor.time" $v_dir/config.ini | awk -F '=' '{print $2}' | head -1)

 

3 循环和条件判断

 

在此说一下我常用的两个结构:
1.
for i in $(seq 1 100); do
        echo $i
done
2.
for (( i = 1 ; $i <= 100; i++ )) ;do
         echo $i;
done

 

4 分组排序测试

#!/bin/bash
cat /nfsdata/chaintest/*.dat|awk -F ',' '{gp=strtonum("0x"substr($1,length($1)-2))%32;ci=gp<10?"00"gp:"0"gp;print >"/nfsdata/chaintest/S_"ci".txt"}';
i=0;
mkdir -p /nfsdata/tmp;
while test $i -lt 32
do
if
test $i -lt 10
then
ci=00$i
else
ci=0$i
fi
sort -u -k 1 -k 2 -t , -T /nfsdata/tmp /nfsdata/chaintest/S_${ci}.txt -o /nfsdata/chaintest/PS_${ci}.txt;i=`expr $i + 1`;
done;
rm -r /nfsdata/tmp;

 

5 sed 和 awk学习

转换格式
dos2unix filename 
去除文件中的双引号
sed 's/\"//g' filename >> rs1
删除第一列
awk '{$1="";print $0}' rs1 >> rs2
删除行首空格
sed 's/^[ \t]*//g' rs2 >> rs3
删除空行
sed '/^$/d' rs3 >> rs4
空格变为逗号
sed 's/ /,/g' rs4 >> rs5

删除最后一行
sed -i '$d' filename
删除第3行
sed -i '3d' filename

 扩展阅读

在UNIX上使用sed命令进行字符串处理中常常遇到的问题就是行首行尾的空格怎么删除。
下面介绍sed是怎样实现的,当然awk同样可以。

1:行首空格
sed 's/^[ \t]*//g'
说明:
第一个/的左边是s表示替换,即将空格替换为空
第一个/的右边是表示后面的以xx开头
中括号表示“或”,空格或tab中的任意一种。这是正则表达式的规范。
中括号右边是*,表示一个或多个。
第二个和第三个\中间没有东西,表示空
g表示替换原来buffer中的,sed在处理字符串的时候并不对源文件进行直接处理,先创建一个buffer,但是加g表示对原buffer进行替换

整体的意思是:用空字符去替换一个或多个用空格或tab开头的本体字符串

2:行末空格
sed 's/[ \t]*$//g'

和上面稍微有些不同是前面删除了^符,在后面加上了美元符,这表示以xx结尾的字符串为对象。

但是要注意在KSH中,Tab并不是\t而是直接打入一个Tab就可以了。

3删除所有的空格

sed s/[[:space:]]//g
View Code

 awk学习

假设数据集
SR      8649    275     Asia
Canada  3852    25      North America
China   3705    1032    Asia
USA     3615    237     North America
Brazil  3286    134     South America
India   1267    746     Asia
Mexico  762     78      North America
France  211     55      Europe
Japan   144     120     Asia
Germany 96      61      Europe
England 94      56      Europe

存贮在countries中

代码
BEGIN {FS = "\t"; printf("%10s %6s %5s  %s\n\n", "COUNTRY", "AREA", "POP", "CONTINENT")}
{printf("%10s %6d %5d   %s\n", $1, $2, $3, $4); area = area + $2; pop = pop + $3}
END {printf("\n%10s %6d %5d\n", "TOTAL", area, pop)}
存储在 cawk中

执行 awk -f cawk countries 得到

    COUNTRY   AREA   POP CONTINENT

        SR   8649   275 Asia
    Canada   3852    25 North America
     China   3705  1032 Asia
       USA   3615   237 North America
    Brazil   3286   134 South America
     India   1267   746 Asia
    Mexico    762    78 North America
    France    211    55 Europe
     Japan    144   120 Asia
   Germany     96    61 Europe
   England     94    56 Europe

     TOTAL  25681  2819

 awk

echo "5,3,5" | awk -F ',' '{ if (cnt<2) { cnt=cnt+1} else { cnt=0; print "commit;"}  print $2}'

----- date 不能按行处理文本, 加入参数xargs -I {} 后可行
head .csv | awk -F ',' '{print $3}' | xargs -I{} date -d @"{}" "+%Y%m%d"

//改变日期格式
---------
[sms@lab233 ~]$ cat abc.txt 
a|2016-09-19 12:58:11|12|23
a|2016-09-19 12:58:11|12|23
a|2016-09-19 12:58:11|12|23
[sms@lab233 ~]$ sed -i 's/://g' abc.txt 
[sms@lab233 ~]$ sed -i 's/ //g' abc.txt 
[sms@lab233 ~]$ sed -i 's/-//g' abc.txt 
[sms@lab233 ~]$ cat abc.txt 
a|20160919125811|12|23
a|20160919125811|12|23



 

 打印文件的特定行

打印文件的特定行
sed -n '50,60p;60q'  test   打印文件 test 的 50~60行
--解释
P      Print up to the first embedded newline of the current pattern space.
q      Immediately quit the sed script without processing any more input, except that if auto-print is not disabled the current pattern space will be printed.
-n, --quiet, --silent
             suppress automatic printing of pattern space

 

解析特定字符,并打印

[sms@lab233 bin]$ sh tete.sh 
1232
234
546
[sms@lab233 bin]$ 
[sms@lab233 bin]$ 
[sms@lab233 bin]$ cat tete.sh 
#!/bin/bash



ath="1232;234;546"

cnt=`echo ${ath}|awk -F ";" '{print NF}'`

for((i=1;i<=$cnt;i=i+1))
do

aa[i]=`echo ${ath}|awk -F ";" '{print $'$i'}'`

done


echo ${aa[1]}
echo ${aa[2]}
echo ${aa[3]}

 

分段解压缩

从veritas网站下载一个storage foundation 5.0的软件,for solaris的,下载了三段文件:
sxrt5.0.dvd1.tar.gzaa  
sxrt5.0.dvd1.tar.gzab 
sxrt5.0.dvd1.tar.gzac

这三个文件怎么合并并解压,用gunzip吗?
veritas网站说有.cmd或者一个.bat文件,执行就可以合并解压了,可是怎么都找不到,
哪位大侠知道?

万分感谢!
-------------------------------------------------

gzcat sxrt5.0.dvd1.tar.gza[a-c]|tar xvf -

or

二楼的办法最直接,你要实在不放心,下面是很“笨”但是很清晰的方式:
1、合并使用spilt分割的文件 
   # cat sxrt5.0.dvd1.tar.gzaa  sxrt5.0.dvd1.tar.gzab  sxrt5.0.dvd1.tar.gzac >>sxrt5.0.dvd1.tar.gz
2、解压gz文件
   # gunzip sxrt5.0.dvd1.tar.gz
3、解tar包
   # tar xvf sxrt5.0.dvd1.tar

 

网友突然问道的,想了很久,发现貌似真的无法用一条命令解决,所以,只能用两条crontab命令来达到crontab设置每个90分钟(一个半小时)执行一次命令/脚本的目的。下面分享下crontab设置每个90分钟(一个半小时)执行一次命令/脚本的设置方法:

    0        0,3,6,9,12,15,18,21 * * *   command
    30    1,4,7,10,13,16,19,22 * * *   command       //注意两个command是相同的一个命令

 

看到有人说用fcron         我没有试过

顺带把crontab的设置解释贴下来:

    *     *   *   *    *  command to be executed
    -     -    -    -    -
    |     |     |     |     |
    |     |     |     |     +----- day of week (0 - 6) (Sunday=0)
    |     |     |     +------- month (1 - 12)
    |     |     +--------- day of month (1 - 31)
    |     +----------- hour (0 - 23)
    +------------- min (0 - 59)
    1
    2
    3
    4
    5
    6
    7
    8
        
    *     *   *   *    *  command to be executed
    -     -    -    -    -
    |     |     |     |     |
    |     |     |     |     +----- day of week (0 - 6) (Sunday=0)
    |     |     |     +------- month (1 - 12)
    |     |     +--------- day of month (1 - 31)
    |     +----------- hour (0 - 23)
    +------------- min (0 - 59)
crontab 90分钟执行一次

 

查询CPU使用情况

根据以上内容,我们则可以很方便的知道当前系统关于CPU、CPU的核数、CPU是否启用超线程等信息。

查询系统具有多少个逻辑核:cat /proc/cpuinfo | grep "processor" | wc -l

查询系统CPU的物理核数:cat /proc/cpuinfo | grep "cpu cores" | uniq

查询系统CPU是否启用超线程:cat /proc/cpuinfo | grep -e "cpu cores"  -e "siblings" | sort | uniq

  输出举例:

    cpu cores    : 6
    siblings     : 6

  如果cpu cores数量和siblings数量一致,则没有启用超线程,否则超线程被启用。

查询系统CPU的个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

查询系统CPU是否支持某项功能,则根以上类似,输出结果进行sort, uniq和grep就可以得到结果。
CPU 情况

 

批量修改文件名字.txt

for i in `ls`; do mv -f $i `echo $i".txt"`; done


#创建目标文件夹
for((i=20170901;i<=20170930;i++));  ##起讫时期请注意修改
do
        mkdir -p /data/jh_work/gsm_jh_2017/TRAFF_${i}
done;


//linux 转换换行符
sed -i 's/\r//'  filename

 

学习文档

http://pan.baidu.com/s/1hvjZ4

 

posted @ 2015-10-14 08:51  kongmeng  阅读(694)  评论(0编辑  收藏  举报