问题:
依次向/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)#########################################################################