1。SHELL版本
os:centos4.3
---------------
ash-0.3.8-20(bourne
shell)1979年,最早。
bash-3.0-19.2(bourne again shell)最流行,LINUX默认SHELL。
tcsh-6.13-9(tc
shell:c shell的增强版)最流行
zsh-4.2.0-3.EL.3(z shell)
pdksh-5.2.14-30.3(korn
shell的免费版本)
#more /etc/shells
/bin/sh==/bin/bash
/sbin/nologin
/bin/bsh
/bin/ksh
/usr/bin/ksh
/usr/bin/pdksh
/bin/tcsh
/bin/csh
/bin/zsh
2。
用途
用途1:翻译提示符后面的命令。
按空格拆分命令行(空格包括:空格、TAB键、新的一行)。
用途2:设置SHELL初始化文
件,个性化用户工作环境.
用途3:解释型的程序语言.
3.SHELL响应过程:
SHELL首先判断命令的第一个词是内建命令还是
存储在磁盘上的.
若是内建命令(该命令就在内存中)就执行.否则就在PATH变量指定的目录列表里查找这个程序,
若找到就启动一个新的进
程来执行这个程序,而SHELL休眠直到程序执行完毕.
1)读取输入并解析命令行.
2)给特殊字符赋值.
3)建立管道 重定向
后台进程.
4)处理信号.
5)建立可执行程序.
4.查看进程的命令:
1)PS
2)PSTREE
5.进程的系统调用过程:
fork系统调用:建新进程.自己的
一个副本.
wait系统调用:暂时挂起父进程.
exec系统调用:执行子进程录入的命令.
exit系统调用:终止子进程.
6.SHELL
脚本
#!:魔术数字.必须在第一行,用来供内核确认哪个程序将翻译并执行这个脚本.
如果在脚本的里边还有一个#!行,那么bash将把它认为是一个一般的注释行.
read命令:从终端或者文件中读取输入的内建命令.
read
参数: read answer 从标准输入读取输入并赋值给变量answer.
read
从标准输入读取一行赋值给变量REPLY.
read -a arrayname
把单词清单读入一个叫做arrayname的数字里.
read -e 在命令行状态下打开命令行编辑.
read -p name: 打印提示,等待输入,并将输入储存在REPLY中.
read -r line
允许输入包含反斜杠.
7.shell位置参数与命令行参数.
命令行参数在脚本中可以按照其位置提供参考作用.
$1
为第一个参数,$2为第二个参数.....到$9后就不一样了,$(10),$(11)...
$0 引用脚本名称.
$#
获取位置参量的个数
$* 列位置参量清单
$@ 同上
"$*" 扩展为一个参数
"$@" 扩展为彼此分隔的参数
8.set命令和位置参量.
set命令用来重置位置参量.
一旦重置旧的参考变量清单就丢失了.
恢复位置参量用命
令"set--".
$0永远是脚本名.
9.选择控制语句:
#!/bin/sh
read a b
if [ "$a" = "$b" ]
then
echo
"yes =="
else
echo "no !="
fi
#!/bin/sh
read a b
if [ "$a" != "$b" ]
then
echo "yes
=="
else
echo "no !="
fi
#!/bin/sh
read a b
if [ "$a" \> "$b" ]
then
echo
"yes =="
else
echo "no !="
fi
#!/bin/sh
read a b
if [ "$a" \< "$b" ]
then
echo
"yes =="
else
echo "no !="
fi
10 shell比较运算
比较算术值:
test -eq(=)
-ne(!=)
-lt(<)
-le(<=)
-gt(>)
-ge(>=)
//()内为解释
比较字符串:= != < >
测试文件是否存在:test -d 目录
-e 存在
-f 普通文件
-h
符号连接
-p 命名管道
-r 可读
-w 可写
-s 非空
-nt
测试FILE1是否比FILE2新。
-ot 测试FILE1是否比FILE2旧
-ef 测试FILE1是不是FILE2的硬连接
11。EXIT命令
EXIT命令用来结束脚本返回命令行。
12。null命令
NULL命令用冒号“:”表示,是一个内
建的什么都不做的命令,返回状态值为0。
13case语句
case 参数 in
变量1)
命令S
;;
变量2)
命令S
;;
*)
命令S
;;
esac
例子:
#!/bin/sh
read a
case "$a" in
1)
echo "a=1"
;;
2)
echo
"a=2"
;;
*)
echo "a=?"
;;
esac
例子:
#!/bin/sh
echo "select one from them"
cat <<-
RNDIT
1) LINUX
2) XTERM
3) SUN
RNDIT
read choice
case
"$choice" in
1) a=linux
echo $a
;;
2) a=xterm
echo $a
;;
3) a=sun
echo $a
;;
*) echo "not
choice"
;;
esac
14.FOR循环
for 变量 in 参数s
do
命令s
done
例子:
for
变量 in $(cat mylist)
do
commands...
done
15.while语句
while 命令
do
命令S
done
例子1:
read a
echo $a
while (( $a < 10 ))
do
echo
"$a"
let a+=1
done
例子2:
while true
do
......
done
16.seq用于产生从某个数到另外一个数之间的所有整数
#!/bin/bash
for i in `seq 1
10`;
do
echo $i
done
17.select语句
主要作用是建立菜单,输入的是菜单中的数字,被保存在指定变量REPLY中,.
常与CASE语句连用.
用LINES
COLUMNS变量来决定终端显示菜单的层.
用PS3来提示用户输入,显示在菜单的底部.
用break命令退出循环(不是退出脚本),
用EXIT命令退出脚本.
#!/bin/sh
COLUMNS=60
LINES=1
PS3="input type"
select
choice in myee50 vt200 xterm sun
do
case $REPLY in
1)
export TERM=$choice
echo $choice
break;;
2|3)
export
TERM=$choice
echo $choice
break;;
*)
exit
;;
esac
done
18.awk gawk
awk(1977年出生):alfred aho,brian kernighan,peter
weinberger三人姓中aho+weinberger+kernighan的缩写.
gawk是GNU
AWK程序语言工程的成果.是其扩展.
nawk是awk的新版本,new awk.
#awk --version
GNU
AWK 3.1.3
例子:
#awk '/NOMARL/{print $1}' filename
//输出filename中包含"NORMAL"的第一个域内容.#df
#df | awk '$4 > 75000'
//awk与管道合用,输出可用块大于75000的分区.
参数-F:
awk -F
//指定的分隔符,可以是字符串或者正则表达式.用''或者""或者[]扩起来.-F不写即默认分隔符是指空格.
与管道合用:
例
子:
# date |awk '{print "month:" $2 "\nyear:" $6}'
month:1月
year:2008
参数转义字符:
\b backspace(即删除一个字符)
\f 换页
\n 新行
\r 回车
\t
制表符
\047 单引号
\c c可以是其他任何字符(除了上面的)
AWK内建变量:
OFMT变量: 用来控制数字输出的格式.默认是"%.6g",即小数点后6位被打印.
例子:# awk 'BEGIN{OFMT="%.2f"; print 1.23456789,12e-2}'
1.23 0.12
OFS: 输出域分隔符 例子:#awk -F'|' 'BEGIN{OFS =
"\t"}{a[$3]++;}END{for(i in a){print i,a[i]}}' login.log.2008-01-*
ORS:
输出记录分隔符
PRINTF的格式化输出:
#echo "linux" | awk '{printf "|%-15s|\n",$1}'
//"-"表示左对齐(没有则为右对齐.见下例),|为分割符,%表示空格,15s表示15个.
|linux |
# echo "linuxfff" | awk '{printf "|%15s|\n",$1}'
|
linuxfff|
PRINTF的转义字符:
c 字符
s 字符串
d 十进制数
ld 长十进制数
u
无正负的十进制数
lu 长的无正负的十进制数
x 十六进制数
PRINTF的修正字符:
- 左对齐
0 用0代替空格填补空白.
PRINTF的格式化说明符:
%c 打印单个ASCII字符
%d 打印十进制
%e 打印用科学记数法表示的数.
%f
打印浮点数
%o 打印八进制
%s 打印字符串
%x 打印十六进制
awk从文件中读取执行:
#awk -f awk.sh filename
awk的记录和域:
AWK把输入的文件堪成具有一定格式和结构的.默认每一个以换行符结束的行称为一个记录.NR表示记录号.
例
子:
# awk '{print NR,$1}' awk.txt
1 {printf"\n"
2 {printf
3
记录里的每个单词都是"域",默认情况下是以空格或者tab分隔的.域的数量保存在内建变量NF里.
# awk '{print
NF,$1}' awk.txt
4 {printf"\n"
4 {printf
注意:域间用逗号隔开,输出就不会挤到一起了.
19.正则表达式元字符
^ 匹配字符串开始
$ 匹配字符串尾
[ABC] 匹配三个字母中的一个
[^ABC] 匹
配非三个字母中的一个
[A-Z] 匹配A~Z中间的字母
20.awk表达式:
表达式:< <= == != >= > ~(匹配正则表达式)
!~(不匹配正则表达式)
例子:
#awk '$1 == 44' 44.txt
#awk '$1 > 44'
44.txt
#awk '$1 >= 44' 44.txt
#awk '$1 ~ /4/' 44.txt
#awk
'$1 !~ /4/' 44.txt
20. awk条件表达式
#awk '{max=($1 > $2) ? $1 : $2; print max}'
44.txt
????
21.AWK运算
运算符号:+ - * / % ^
例子:awk '{print $1*$2}' 44.txt
22.AWK逻辑运算
逻辑运算符号:&&(逻辑和) ||(逻辑或) !(逻辑非)
例子:awk
'!($1 > 2 && $2 < 66)' 44.txt
23. AWK范围模版
匹配从第一个模版出现到第二个模版出现间的行.
#awk '/'33'/,/5/' 44.txt
24. AWK赋值语句
#awk '$1 == "3"{$1 = "333";print}' 44.txt
//如果$1等于3,则赋值333给$1并打印.
25.AWK编程
在AWK中,变量不需要定义就可以直接使用.
变量由字母 数字和下划线组成,但不能以数字开头.
赋值
符号: = += -= *= /= %= ^==
26. AWK的BEGIN+END模块
BEGIN模块后面跟着动作块,该动作块在AWK处理任何输入文件行之前执行.
BEGIN
模块通常被用来改变内建变量的值,如OFS RS FS等.
例子:awk -F'|' 'BEGIN{OFS =
"\t"}{a[$3]++;}END{for(i in a){print i,a[i]}}' login.log.2008-01-*
END模块不匹配任何输入文件,但是执行动作中的所有动作.在整个输入文件处理完毕后被处理.
例子:awk -F'|'
'BEGIN{OFS = "\t"}{a[$3]++;}END{for(i in a){print i,a[i]}}'
login.log.2008-01-*
27.awk数组:AWK中数组的下标可以是数字和字母,称为关联数组.
1)用变量作为数组下标.
如:#awk
{name[x++]=$2};END{for(i=0;i数组
NAME中的下标是自定义变量X,AWK初始化X的值为0,在每次使用后增加1.
第二个域的值被赋予NAME数组的各个元素.
在END模
块中,FOR循环被用于循环整个数组,从下标为0的元素开始,打印那些存储在数组中的值.
因为下标是关键字,所以它不一定从0开始,可以从任何值
开始.
2)special for循环用于读取关联数组中的元素. {for (item in arraryname){print
arraryname[item]}}
例子:awk '/^zbt58/{name[NR]=$1};END{for(i in
name){print i,name[i]}}' count-sql-2.sql
3)用字符串作为下标.如count["test"]
4)
用域值作为数组的下标.新的循环方式.
例子: awk '{name[$1++]}END{for(i in name){print
i,name[i]}}' test
5)delete函数用于删除数组元素.??
28.AWK重定向和管道
输出重定向:
用> >>重定向到指定文件,文件名必须用""扩起来.例子 awk
'$1 >=2 {print $1,$2 > "/tmp/ff.txt"}' 44.txt
输入重定向:
getline函数,它获得输入,获得下一行的内容,并给NF NR FNR等内建变量赋值.
用管道指定输出格式:awk '{print $1,$2 | "wc -l"}' count-sql-2.sql
注意:管道符号右
边可以通过双引号关闭管道.
管道不会自动关闭;等AWK语句结束它才关闭.
在同一时刻只能有一个管道存在.
例
子:awk '{print $1,$2 | "wc -l"}END{close("wc -l")}' count-sql-2.sql
============================================
grep:
命令格式:grep
word filename1 filename2 ...
功能:在一个或多个文件中搜索正则表达式并打印所有包含这些表达式的行.
注
意:
1)如果模板包括空格则必须被引用.
2)模板可以是一个被引用的字符串或者一个单词,其后面的所有字符串被看作文件名.
3)GREP
把搜索结果送到屏幕,但是不影响输入文件.
4)执行完grep后,#echo $? 如果是0表示正常.如果是1表示没找到.
版本包括:
grep 包括GNU版本的GREP.使用正则表达式基本集和扩展集.
egrep
是GREP的扩展,支持更多的RE元字符.使用正则表达式扩展集
fgrep 是FIXED GREP OR FAST GREP
,把所有的字母都看作单词.使用正则表达式扩展集
正则表达式基本集:
^word 匹配所有以word开头的行
$word 匹配所有以word结尾的行
word1.word2 匹
配一个字符
* 匹配多个??
[L]ove 匹配所有包含love或者Love的行.
[A~Z] 匹配第一个字母是大写的行.
[^A-
Z]ove 匹配所有第一个字符不是A-Z间,后面是ove的行.
/love\> 锚定单词的结
束.
GNU GREP选项:
格式:GREP 选项 参数 文件1 文件2 ..
-b 在搜索到的行前面打印该行所在的块号
码.是块号,不是行号.
-n 在每行前面打印该行在文件中的行数.
-c 只显示有多少行匹配,不具体显示匹配的行.
-h 不显示
文件名(搜索多个文件的时候)
-i 在字符串比较的时候忽略大小写
-l 只显示包含匹配模板的行的文件名清单,不同项目间用换行符分隔.
-s 静
默工作.有错误出现时才打印信息.
-v 反检索,只显示不匹配的行.
-数字 同时显示匹配行上下"数字"行的信息.即同时显示上下几行.
==========================
SED:一个流线式的非交互的编辑器。非破坏性的,在你用SHELL重定向存储
输出前不会改变你的文件。
版本:GNU SED
工作原理:SED一次处理一行文件(OR输入),输出到屏幕.
它把当前处理的
行存储在临时缓冲区,称为模式空间.处理完当前行后移出,读取下行到模式空间.
通过模式空间,保证了原始文件不会被破坏.
例子:
#sed
'1,3d' 44.txt //打印除了1 2 3行外的其他行.
#sed -n '5 p' 444.txt
//打印匹配数字5的行.
===========================
""与''的区别:
在 bash 中,常用的 quoting 有如下三種方法:
* hard quote:' '
(單引號),凡在 hard quote 中的所有 meta 均被關閉。
* soft quote: " " (雙引號),在 soft
quoe 中大部份 meta 都會被關閉,但某些則保留(如 $ )。(註二)
* escape : \ (反斜線),只有緊接在
escape (跳脫字符)之後的單一 meta 才被關閉。