EXPORT
export命令将会使得被export的变量在运行的脚本(或shell)的所有的子进程中都可用.
不幸的是,没有办法将变量export到父进程(就是调用这个脚本或shell的进程)中.
关于export命令的一个重要的使用就是用在启动文件中,启动文件是用来初始化并且
设置环境变量,让用户进程可以存取环境变量.
一些特殊的变量
$0就是该bash文件名
$?是上一指令的返回值
$*是调用当前脚本时的所有参数
$@基本上与上面相同。只不过是
$*返回的是一个字符串,字符串中存在空格。
$@返回多个字符串。
$1,表示运行shell脚步时提供的第一个参数;$2,表示运行shell脚步时提供的第二个参数;
重定向
exec 2>$OUTPUT_PATH/$DATE/err_${TIME}.log
将错误日志重定向到err_${TIME}.log文件中。
exec 2>&11>$OUTPUT_PATH/$DATE/err_${TIME}.log可以使得stderr和stdout内容都被重定向,
括号的用途
把括号中的所有表达式的结果都传到下一个管道,而不是只传输最后一个表达式。
[@djt_7_94 ~]# (echo 123|cat >&2;echo 456) 1>/dev/null
123
[@djt_7_94 ~]# (echo 123|cat >&2;echo 456) 2>/dev/null
456
EXEC的两种使用方式
方式一
exec program
将program 程序替代当前程序进程.
这就意味着exec 后面再跟任何命令都是没有意义的, 因为他们永远得不到执行
==============================================
方式二
可以用exec 命令来关闭标准输入, 然后再以任何从中读取的文件重新打开
要把标准输入改变到文件, 用以下的格式的exec命令exec < file
以后任何从标准输入读数据的命令都会从file中读取
如果用exec 重新分配了标准输入, 后来又想重新分配到别处, 只需要再执行一次exec.
如果要把标准输入重新改回终端, 可以写
exec < /dev/tty
以上讨论的内容也适用于重新分配标准输出. exec > report 将此后所有写向标准输出的文件写入report文件.
注: 这里的exec 不是像前面介绍的那样用来启动运行新程序的, 而是用来重新分配标准输入
和标准输出的.
简单的WhileLoop程序
set -ux
v1=1#不要错写为$v1=1
while [ "$v1" -lt "6" ] #注意[和]的前后都有空格, -lt的前后都有空格
do
echo "this is the $v1 time of showingup"
v1=$(($v1+1)) #注意$(( ))是数学计算式
done
大括号的使用
cat{err.log,test1.sh,test2.txt}>RedirectFile.txt #将大括号中三个文件重定向到RedirectFile.txt
cat {err.log,test1.sh,test2.txt}|more#将大括号中三个文件重定向到屏幕
cat {err.log,test1.sh,test2.txt}#将大括号中三个文件重定向到屏幕
注意大括号中的项目之间使用逗号分隔,并且不能加空格,否则报错。
CAT的功能
1.一次显示整个文件。$catfilename
2.从键盘创建一个文件。$ cat >filename
3.将几个文件合并为一个文件。$cat{file1,file2} > file.txt
或者$cat{file1,file2} > file.txt
4.清空一个已有的文件。$cat/dev/null > RedirectFile.txt
对路径/文件/变量等进行判断
1注意[ ]前后的空格和围住变量的双引号;
2注意-z参数表示zerolength,但是-n参数表示non-zero length。
var="hello"
if [-z"$var"]
then
echo "zero length"
else
echo "non-zero length"
fi
普通AWK的写法
分析apace日志,获取访问量较大的前十个IP地址
awk ‘{ips[$1]++;}END{for(ip in ips)printip,ips[ip]}’|sort –nk2|head -10
实例结果分析:该apace日志首列保存ip信息。能过awk对日志进行一次遍历,即实现了IP信息的获取,同时采用了哈希结构,对ip进行了累计。
带参AWK的写法
#!/bin/bash
INPUT_FILE=./NewPinyinWord.txt
cat /search/ff/ realtime_DATA/20120515/yyidword.10*|head -10|awk -F"\t" -v file=$INPUT_FILE 'BEGIN
{
while((getline<file)>0)
{
map_NewPinyinWord[$1]=1
}
}
{
for (i=2;i<=NF; i++)
{
tot=split($i,array,"|")
#awk编号从1开始不是从0开始
#?split usage
#?use"cut" instead of "split"
KeyWord=array[2];
}
if(KeyWord in map_NewPinyinWord)
map_NewPinyinWord[KeyWord]=2;
}
END
{
for (key in map_NewPinyinWord)
{
if(map_NewPinyinWord[key]==2)
printkey"\t+"
else
print$1"\-"
}'
借助AWK使用随机函数
head -10000 ./orin_realtime_DATA/ id_file |awk '{ if (rand()<0.01) print $0}' |wc -l
awk中使用随机函rand(),然后wc -l统计所有行的行数(本行结果:10000*0.01=100)
AWK在统计中使用的样例
zcat $filelist|
awk -F"\t"'($16=="http://www.sogou.com"||$16=="http://www.sogou.com/")&&$13==0'|
awk -F"\t"'{d[$14]+=$15;t[$14]++; tot_cost+=$15}
END{for(i in d){printi"\t"t[i]"\t"d[i]"\t"d[i]*1.0/tot_cost}}' |
sort -k3nr>data/key_click_cost_percent.txt
AWK在改变文件输出格式中的作用
echo123,324,222|awk -F"," '{ printf("%s",$1); for(i=2;i<=NF;i++) printf("\t%s",$i); printf("\n"); }'
123324 222
花括号与圆括号与反引号
花括号{}进行变量替代 ${myname}
圆括号()进行命令替代 $(pwd)
反引号``等价命令替代 `pwd`
我们在shell操作上,需要在一定条件下一次执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。
圆括号( )
( )将command group置于sub-shell去执行,也称nestedsub-shell。
花括号{}
{ }则是在同一个shell内完成,也称为non-namedcommand group
使一个进程在后台运行的方法
使得一个进程在后台运行可以采取的办法是
①nohup ctrl+z然后bg
②screen命令
③crontab
cut的用法
[@djt_7_94 feiwenyi]# echo 11-22-33|cut-d"-" -f2,3
22-33
[@djt_7_94 feiwenyi]# echo 11-22-33|cut-d"-" -f2,3|cut -d"-" -f1
22
注意管道符号前后有没有空格都会输出相同的显示结果
从文件中读入数据到SHELL
while read LINE
do
echo "LINE : $LINE"
done < auto.sh