坑爹的shell脚本-血一般教训后的总结

刚开始做shell编程的时候,那叫一个坑爹,错到想哭,因为根本就找不到问题所在,所以撞了几次墙终于有所感觉了,知道一些常识,后面撞墙也就越来越少了。

有些东西还是要记下来比较好,否则的话就不是欲哭无泪了,却是头破血流,尸横遍野,惨不忍睹

一:一些基本的必须知道的东西,不然几乎写不出一行代码!

1.
if数字比较
if (($A == $B));then 
echo "==" 
fi 

if (($A >= $B));then 
 echo ">=" 
fi 
 
if (($A <= $B));then 
echo "<=" 
fi 
 
if (($A != $B));then 
echo "!=" 
fi 
if (($A > $B));then 
 echo ">" 
fi 

if (($A < $B));then 
echo "<" 
fi 


或者:
if [ $A -eq $B ];then 
echo "eq" 
fi 


if字符串比较
if [ "$A" = "GS" ];then
echo "yes"
两个等号就要两个中括号

2.
命令列表是这样使用的
val="$(ls -t p*.txt|head -n 1)"

3.字符串截取
var=$val
var=${var##*_}  左边最后一个_之前的删掉如果一个#就是第一个
var=output${var%.*}右边第一个点右边的删掉,若最后一个%%

4.echo
(1)echo “result=” . $result #点号相当于+
(2)echo "the command txt is named :   "$val
(3)$a="dfdfd" echo "dfdfdff $a"
 (4)若是单引号,则是原值而不是变量

5.关于整数的问题
shell中的test语句只能用于整数判断,要判断小数用awk吧,awk中是C语言环境
var=.21
var="0"$var
echo $var | awk '{if($0 < 1) print "Less than 1"; else print "No less than 1"}'
$ i=0;
$ let i++
$ ((i++))
$ expr $i + 1

for语句

for((i=1;i<=10;i++));do
echo "the loop number i: $i";
done;

while语句

i=10;

while [[ $i -gt 5 ]];do

echo"the loop number of while case is: $i";


((i--));

case语句

#!/bin/sh

case $1 in

start | begin)

echo "start something"

;;

stop | end)

echo "stop something"

;;

*)

echo "Ignorant"

;;


esac
6.判断字符串是否为空

#!/bin/bash

a=$1


if [ -z "$a" ]; then

echo"a is empty."

else echo "a is a object."
fi

二:文本的一些实用性技巧:

将文本的某几列替换的写法

  cat $BASEDIR'dayFinal.txt'| awk -v a=$1 -v b=$2 -v c=$COMMAND_PATH '{$4=a;$5=b;$1=c;print}'>$myFile;

搜索文本关键字并删除包含关键字的行
:g/\.svn/d  删除所在的行
:%s/20160809//gn 定位
按照文本的某一列排序,-r是倒序,1,8表示按照该列前8个字符排
12!sort -r -n -k4.1,5
%!sort -n -k4.1,8 按照某列排序

分组计数
ls output15new | awk -F '_' '{print $7}' | awk '{s[$1]+=1}END{for(i in s){print i,s[i]}}'分组计数

或且查找
egrep 'a|d|f' x.txt 查找或  
且查找用管道

ls是严格匹配,但是grep只是包含的关系
ls和grep是两回事

KDB_*_201606*.csv ./mydata06/

grep day_.*_20160429.csv

awk加判断语句选择白天黑夜
cat test.txt | awk '{if($21>0) {for(i=1;i<=NF;i++) printf("%s ",$i);printf("\n")} }' >tt.txt


三:数组


echo ${#a[@]} 数组长度



echo ${a[2]} 某个数组元素


echo ${a[*]}整个数组全部,也可以用@代替*


a[1]=100赋值


unset a删除数组


unset a[1]  删除某一个



a=(1 2 3 4 5)

[chengmo@centos5 ~]$ echo ${a[@]:0:3}



       c=(${a[@]:1:4})取部分

[chengmo@centos5 ~]$ echo ${#c[@]}

4

[chengmo@centos5 ~]$ echo ${c[*]}



a=(1 2 3 4 5)   每个元素做同样的事情

      [chengmo@centos5 ~]$ echo ${a[@]/3/100}

调用python产生csv的脚本

四一些自己写的脚本:gen_csv.sh

  1 #!/bin/bash
  2
  3 a=$(ls ../egg_spot_data/PriceData/*.csv)
  4 for i in ${a[@]}
  5 do
  6                                                                                                                                             
  7     python ./eggSpotIndex.py -m info.map -i "$i" -o . -d "False"""""
  8 done
  9
 10

分组计数的脚本
#!/bin/bash

a=$(ls $1 | awk -F '_' '{print $7}')
echo "$a" | awk '{s[$1]+=1}END{for(i in s){print i,s[i]}}'



#ls output15new | awk -F '_' '{print $7}' | awk '{s[$1]+=1}END{for(i in s){print i,s[i]}}'

定时执行任务的脚本

cd $(dirname $0)
BASEDIR=$(pwd)
Q=/home/data/q/q3.3.sh

COMMAND_LIST=$BASEDIR/command_list.txt
COMMAND_HISTORY=$BASEDIR/command_history.txt

rm $COMMAND_LIST
rm $COMMAND_HISTORY
touch $COMMAND_LIST
touch $COMMAND_HISTORY

mkdir -p $BASEDIR/output
mkdir -p $BASEDIR/output_old

mv $BASEDIR/output/* $BASEDIR/output_old

bash -c "$BASEDIR/gen_command_list.sh $(date +%Y-%m-%d -d "yesterday") $(date +%Y-%m-%d -d "yesterday") night"
# bash -c "$BASEDIR/gen_command_list.sh 2016-04-07 2016-04-07 night"
sleep 1
bash -c "$BASEDIR/gen_command_list.sh $(date +%Y-%m-%d) $(date +%Y-%m-%d) day"
# bash -c "$BASEDIR/gen_command_list.sh 2016-04-08 2016-04-08 day"

bash -c "$BASEDIR/gen_command_list.sh $(date +%Y-%m-%d -d "yesterday") $(date +%Y-%m-%d -d "yesterday") night"
# bash -c "$BASEDIR/gen_command_list.sh 2016-04-07 2016-04-07 night"
sleep 1
bash -c "$BASEDIR/gen_command_list.sh $(date +%Y-%m-%d) $(date +%Y-%m-%d) day"
# bash -c "$BASEDIR/gen_command_list.sh 2016-04-08 2016-04-08 day"
sleep 5
bash -c "$BASEDIR/start_command_list.sh"
sleep 5
bash -c "$Q $BASEDIR/../sim_futures.q $BASEDIR/output"

echo "$(date +%Y-%m-%d %H:%M:%S) Daily parameter optimization finished!"

替换文件某几列的脚本
#/bash/bin

if (( $#==4 ));then
        cat $1 | awk -v a=$2 -v b=$3 -v c=$4 '{$4=a;$5=b;$1=c;print}'>command_new.txt;
elif (( $#==3 ));then
        cat $1 | awk -v a=$2 -v b=$3 '{$4=a;$5=b;print}'>command_new.txt;
elif (( $#==2 ));then
        cat $1 | awk -v a=$2  '{$4=a;$5=a;print}'>command_new.txt;
fi

计算生成文件速度的脚本
 1 #!/bin/bash
  2  Date=$(date +%s)
  3  count=$(ls $1 |wc -l)
  4  while true
  5  do
  6      DateNew=$(date +%s)
  7      if(($(date +%s)==$Date+1));then
  8          Date=$(date +%s)
  9          count_new=$(ls $1|wc -l)
 10          tmp=$(($count_new-$count))
 11          count=$(ls $1 |wc -l)
 12          echo $tmp
 13      fi
 14 done



解决一个问题:mv或者cp参数列表太长:find . -name "*.csv" -exec cp {} /home/data/output/ \;







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值