您的位置:首页 > 运维架构 > Shell

BASH命令和SHELL脚本总结(1)入门篇

2012-05-16 00:04 791 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: