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
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
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)
查询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就可以得到结果。
批量修改文件名字.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
学习文档