(7) Linux ----- Shell脚本(例子)

(1)#########################################################################
问题:
    依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么。 (用户名和用户id)
    同时统计一个有多少个用户。 

思路:

先读取/etc/passwd最后一行  并通过自定义的分隔符 得到第一分割后的第一部分
tail -n 1 /etc/passwd
mysql:x:502:503::/home/mysql:/bin/bash

tail -n 1 /etc/passwd | cut -d : -f1   (用户名)
mysql
tail -n 1 /etc/passwd | cut -d : -f2
x
tail -n 1 /etc/passwd | cut -d : -f3  (用户id)
502

一个有多少个用户。
wc -l /etc/passwd 输出的结果是 36  /etc/passwd   
现在只需要数字  需要用cut命令 只取出36这个数值
wc -l /etc/passwd | cut -d " " -f1  可只得到数值36

seq  1 4命令的输出结果 
1
2
3
4

for循环
--------------------------
#! /bin/bash
for i in `seq 1 4`
do
 echo $i;
done
--------------------------
1
2
3
4

如何取出每一行呢?
head 10  tail 1   就能每次读出一行 且该行是 最新的。

head -1 /etc/passwd |tail -n 1   (取出第一行)
head -2 /etc/passwd |tail -n 1   (取出第二行)

answer:
01forusers.sh
--------------------------
#! /bin/bash

#1 定义file变量
file=/etc/passwd

#2 计算出file中行数即用户数
lines=`wc -l $file |cut -d " " -f1`

#3 for循环遍历每一行输出 用户名和用户id
for I in `seq 1 $lines`
do
   uname=`head -$I $file |tail -n 1 |cut -d ":" -f1 `
   uid=`head -$I $file |tail -n 1|cut -d ":" -f3`
   echo "Hello ${uname},you UID is ${uid}"
done

#4 最后输出用户数目 并退出
echo "userNums id ${lines}"
exit 0

--------------------------
(1)#########################################################################

(2)#########################################################################

问题:
 1.切换工作目录至/var
      2.依次向/var目录中的每个文件或子目录问好,形如:
        (提示:for FILE in /var/*;或for FILE in `ls /var`;)
        Hello,log
      3.统计/var目录下共有多个文件,并显示出来

思路:
ls /var    只显示var下的
ls /var/*  显示var下的 同时还显示 子目录的
此处不能用wc -l 计算行数  因为文件数 和行数 ls命令并不匹配

answer:
02varfile.sh 
--------------------------
#! /bin/bash

#1 进入到var目录中 (此处不写 可以在ls命令中写全路径)
cd /var

#2 定义num 作为计数器
let num=0

for i in `ls ./*`
do
  echo "${i} hello"
  num=$[${num}+1]
done

echo "var目录下共有${num}个文件"

--------------------------

(2)#########################################################################
--------------------------

(3)#########################################################################

问题:
     将目录下所有以.log结尾的日志文件打包tar.gz文件,并删除源文件


思路:

#!/bin/bash
#cd到要操作的根目录
cd /data/logs/flume
#循环本目录下面所有的log文件 
for i in $(find -name *.log);
do
   
   #获取要操作的文件信息
   context=`echo ls -l $i | awk -F/ '{print$NF}'`
   #获取文件路径
   path=$i
   #需要配置到根目录
   cd /data/logs/flume/${path%/*}
   #压缩文件
   tar -czf  ${context%.*}.tar.gz $context
   #删除文件
   rm -rf $context
done

新加了一个需求  大小为0的日志文件不打包。直接删除。不为0的需要打包然后进行删除源文件

多了一层if判断而已。 (#_#!粗心写错了tar zvcfP  ${filename%.*}.tar.gz  ${pathStr} >/dev/null 将导致导包出现严重问题


---<在上个例子基础上改了改>-------------------------------------

#!/bin/bash
#cd到要操作的根目录
cd /data/logs/flume
#循环本目录下面所有的log文件 
for i in $(find -name *.log);
do
   
   #获取要操作的文件信息
   context=`echo ls -l $i | awk -F/ '{print$NF}'`
   #获取文件路径
   path=$i
   #需要配置到根目录
   cd /data/logs/flume/${path%/*}
   #获取文件的大小
   FILE_SIZE=`ls -l $context | awk '{print $5}' `
   #判断文件大小 如果为0直接删除
   if [ $FILE_SIZE -ne 0 ];then    
    #压缩文件
   tar -czf  ${context%.*}.tar.gz $context
  fi
     #删除文件
     rm -rf $context
done

----------------------------------------

#!/bin/bash

for i in $(find /data/logs/flume/ -name *.log);
do
   filename=`basename $i`
   pathStr=`dirname $i`
   size=`ls -l $i|awk '{print $5}'`

   cd $pathStr
   if [ ${size} != 0 ] ; then
      tar zvcfP  ${filename%.*}.tar.gz  ${filename} >/dev/null
   fi
   rm -rf $filename

done

其他的实现方式:  删除空文件      $1/$file 是文件的绝对路径


 

(3)#########################################################################
(4)#########################################################################

需求:hive查询结果导出到txt文件,然后对文件进行处理拆分成257个文件,然后再导入至mysql 数据库

存在问题: 处理数据的思路,没有问题。但是查询得到的文件有1G ~10G, 脚本处理的效率会非常低。

#!/bin/bash
IFS="\t"
dateYmd=`date -d yesterday +%Y%m%d`
#############################################################################
###1.1  query bt
/usr/local/hive-0.12.0/bin/hive -e "select accessY,accessYM,accessYMD, accessYMDH,accessYMDHM,ispCode,remoteIp,sum(v) from vdnaccesslog.srcbt where date = '${dateYmd}' and v is not null and accessY is not null and accessYM is not null and  accessYMD is not null and accessYMDH is not null and accessYMDHM is not null and ispCode is not null  group by remoteIp,ispCode, accessY,accessYM,accessYMD,accessYMDH,accessYMDHM;" > /mnt/resource/dist/bt/personbt/data_bt_peruser_${dateYmd}.txt

###1.2 parse data_bt_peruser_${dateYmd}.txt 生成数据文件 0 -255 null
cat /mnt/resource/dist/bt/personbt/data_bt_peruser_${dateYmd}.txt | while read line
do
   #IP String
   ipstr=`echo ${line}| awk  -F '\t'  '{print $7}'`
   #IP last num isornot null
   lastnum=`echo ${ipstr}|cut -d. -f4`
    if [ ${lastnum} != "null" ] ; then
      echo ${line} >> /mnt/resource/dist/bt/personbt/txtdoc/kdl_ip_bt_${lastnum}.txt
   else
      echo ${line} >> /mnt/resource/dist/bt/personbt/txtdoc/kdl_ip_bt_null.txt
   fi
done
###1.3  0-255入库
for i in {0..255}
do
/usr/local/mysql/bin/mysql -h10.240.18.201 -uhive -p1234561 -e "load data local infile '/mnt/resource/dist/bt/personbt/txtdoc/kdl_ip_bt_${i}.txt' into table vdnaccesslog.kdl_ip_bt_${i} character set utf8 (accessy,accessym,accessymd,accessymdh,accessymdhm,isp,ip,totalbt);"
done
###1.4  null 入库
/usr/local/mysql/bin/mysql -h10.240.18.201 -uhive -p1234561 -e "load data local infile '/mnt/resource/dist/bt/personbt/txtdoc/kdl_ip_bt_null.txt' into table vdnaccesslog.kdl_ip_bt_null character set utf8 (accessy,accessym,accessymd,accessymdh,accessymdhm,isp,ip,totalbt);"

###1.5  删除所有的数据文件
rm -rf /mnt/resource/dist/bt/personbt/txtdoc/*
rm -rf /mnt/resource/dist/bt/personbt/data_bt_peruser_${dateYmd}.txt


(4)#########################################################################
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

(5)#########################################################################

Mysql 脚本 指向Mysql 建库建表http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201141142057473/

#!/bin/bash

HOSTNAME="10.240.81.201"    #数据库Server信息
PORT="3306"
USERNAME="hive"
PASSWORD="123456"
DBNAME="vdnaccesslog"      #要创建的数据库的库名称
TABLENAME="test_table_name"  #要创建的数据库的表的名称

MYSQL_CMD="mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}"
create_table_sql="create table ${DBNAME}.${TABLENAME}(
id int not null auto_increment primary key,
accessy  varchar(4),
accessym varchar(7),
accessymd varchar(10),
accessymdh varchar(13),
accessymdhm varchar(16),
isp varchar(16),
ip varchar(16),
totalpt int
)engine=innodb default charset=utf8;"
echo ${create_table_sql} | ${MYSQL_CMD} ${DBNAME}   #在给定的DB上,创建表

(5)#########################################################################



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值