第一部分文件安全与权限
权限
-rwxrwxrwx             rwx      读+写+执行      s 文件属主和组set-ID t 粘性位
                      4 2 1
U+G+O
User+group+other
 
文件类型
d 目录
l 符号链接
s 套接字文件
b 块设备文件
c 字符设备文件
p 命名管道文件
- 普通文件
 
改变文件权限
 
chmod
u文件所有者
g同组用户
o其他用户
a所有用户
+增加权限
-取消权限
=设定权限
 
suid/guid
why?当其它人使用有suid/guid的文件时就会有止文件所属用户的权限,这是很危险的!!
 
chown 改变所属用户chgrp 改变所属组
 
umask 默认文件权限设置 ,设置方法为777减去文件权限所得的值。
 
第二部分findxargs
Find pathname –iptions
find / -name xxx
 
-name 按文件名查找
Find / -name “*.txt” -print
-perm 按文件权限 查找
Find / -perm 755 -print
-prune 使find不在当前目录查找,如果同时使用了-depth那么-prune将被find 忽略
-user 按文件所属用户查找
-group 按所属组查找
-mtime –n +n 按文件更改时间来查找-n表示距现在n天内+n表更改时间距现在n天以前,另外还有-atime和-ctime选项用法和-mtime相似
-nogroup 查找不属于任何组的用户
-nouser 查找不属于任何人的文件
-newer file ! fiel2 查找比file1新但比file2旧的文件
-type 查找某一类型的文件如:
d -目录
l -符号链接
s -套接字文件
b -块设备文件
c -字符设备文件
p -命名管道文件
f - 普通文件
-size n[c]查找文件长度为n块的文件,带c时表示文件长度以字节计。
-depth 查找文件时先查找当前目录,再查找子目录。
-fstype 查找某一类型文件系统中的文件,
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接,就跟踪止链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。、
 
使用exec或ok来执行shell命令,在找到一些文件后使用-exec来执行相关命令
-exec 后跟要执行的命令,一对{} 一个空格和一个\最后一个分号
Find . –type f –exec ls –l {} \;
 
xargs?????
 
第三部分后台执行命令
at
cron 和crontab
&
Nohup 后台运行一个命令,即使用户退也也不受影响。
 
*          *           *           *           *             command
分      时         日         月          周            命令
 
Crontab [-u user] –e –l –r
       用户 编辑 例出 删除
 
at [-f script] [-m –l –r ] [time] [date]
-f script 命令或脚本
-l 列出
-r 删除
-m 完成后发邮件
第四部分文件名置换
* 匹配任何字符串,包括空字符串。
?匹配任何单个字符
[…] 匹配[]中所含的任何字符
[!....]匹配[]中除!之后的字符
 
第五部分shell输入与输出
 
echo \c          \f            \t              \n
不换行      进纸         跳格          换行
 
read   
cat
 
管道 | 前一个命令的输出做为后一个命令的输入
tee    一个输出到标准输出,另一个拷到相应的文件中
 
标准输入,输出和错误
0          1       2
 
文件重定向
> >> < 
comm > file 2>&1
 
exec 替换当前shell
 
第六部分
&&             ||
返回0          返回非0
()             {}      
当前shell      子shell   
 
第七部分正则表达式
基本元字符及含义
^    只匹配行首
$    只匹配行尾
*    一个单字符后跟*,匹配0个或多个止字符
\    屏蔽特殊字符
pattern\{n\}      匹配前面pattern出现次数,n次
pattern\{n,\}m    同上,但次数最少为n
pattern\{n,m\}    同上,但pattern 在n与m 次之间。
 
第八部分grep家族
grep     grep “sort” *.doc
-c    只输出匹配行的计数                  grep –c “48” data.f
-i     不区分大小写
-h     查询多文件时不显示文件名
-l      查询多文件时只输出包含匹配字符的文件名
-n     显示匹配行及行号
-s     不显示不存在或无匹配文本的错误信息
-v     显示不包含匹配文本的所有行
 
grep 和正则表达式
grep ‘48[34]’ data.f       查找483 或484
grep ‘^[^48]’ data.f       查找非48开头的行
grep ‘[Ss]ept’ data.f       查找sept或Sept
grpe ‘K…D’ data.f        查找K开头D结尾五个字母的单词
grep ‘4\{2,\}’ data.f        找4至少出现2次的行
grep ‘6\{2,6}3’ data.f      找6出现2到6次,并以3结尾
grep –E ‘219|216’ data.f    找219或216
grep ‘^$’ data.f           找空行
 
类名
类                     等价的正则表达式
[[:upper:]]               [A-Z]
[[:lower:]]               [a-z]
[[:digit:]]                [0-9]
[[:alnum:]]               [0-9a-zA-Z]
[[:space:]]                空格或tab
[[:alpha:]]                [a-zA-Z]
 
egrep
 
第九部分awk介绍
模式和 动作:模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。 <?xml:namespace prefix = o />

域和记录

1      分隔     符域2      分隔符     域3        分隔符     域4及换行

Bunny       #        02/99          #             48               #               Yellow\n

$1                        $2                             $3                                 $4

全文为$0

模式和运行??
域和记录
抽取记录
awk ‘{print $0}’ grade.txt >wow 抽取全文
awk ‘{print $1}’ grade.txt >wow 抽取域1也就是第一列
awk ‘{print $1,$4}’ grade.txt >wow 抽取域1和域4
awk ‘BEGIN {print “Name Belt\n---------------------------”}{print$1”\t”$4}’ grade.txt 打印开头
Name       Belt
---------------------------------
M.Tansley      Green
.
.
.
L.Tansley     Brown-3
 
Awk ‘BEGIN {print “Name\n-----”} {print $1} END {“end-of-report”}’ grade.txt
打印开头和结尾
Name
--------
.
.
.
end-of-report
 
awk及正则表达式
\    ^   .   []   | ()   *   + ?
注:+和?只适用于awk
 
Awk条件操作符
<=
==
!=
>=
~         匹配正则表达式
!~      
 
Awk内置变量
ARGC                       命令行参数个数
ARGV                       命令行参数排列
ENVIRON                    支持队列中系统环境变量的使用
FELENAME                   awk浏览的文件名
FNR                          浏览文件的记录数
FS                           设置输入域分隔符,等价于命令行-F选项
NF                           浏览记录的域个数
NR                           己读的记录数
OFS                          输出域分隔符
ORS                          输出记录分隔符
RS                           控制记录分隔符
 
awk ‘{print NF,NR,$0}END{print FILENAME}’ grade.txt
 
awk操作符
= += *= / = %= ^ =               赋值操作符
?                             条件表达操作符
|| && !                        并,与,非
~ !~                          匹配操作符,匹配和不匹配
< <= ==    != >>           关系操作符
+ - * / % ^               算术操作符
+ + --                       前缀和后缀
 
内置的字符串函数
gsub(r,s)                          $0中用s替代r
gsub(r,s,t)                         t中用s替代r
index(s,t)                          返回s中字符串t的第一位
length(s)                          返回s长度
match(s,r)                         测试s是否包含匹配r的字符串
split(s,a,fs)                        在f上将s分成序列a
sprint(fmt,exp)                     返回经fmt格式化后的exp
sub(r.s)                           用$0中最左边最长的子串代替s
substr(s,p)                         返回字符串s中从p开始的后缀部分
substr(s,p,n)                      返回字符串s中从p开始的长度为n的后缀部分
 
awk中使用的屏蔽序列
\b           退格键
\f           走纸换页
\n           换行
\r            回车键
\t            tab键
\ddd          八进制值
\c            任意其它特殊字符
 
awk printf修饰符

-             左对齐

Width    域的步长,用0表示0步长

-prec     最大字符串长度,或小数点左边的位数

awk printf格式

%c           ASCII字符

%d     整数

%e     浮点数,科学记数法

%f     浮点数,例如(123.44)

%g        awk决定使用哪种浮点数转换e或者f

%o    八进制数

%s    字符串

%x    十六进制数
 
awk数组
 
第十部分sed用法介绍
Sed是一个非交互性的文本流编辑器。
Sed在文件中定位文本的方式
x                     x为一行号,如1
x,y                   表示行号范围从x到y如2,5表示从第2到第5行
/pattern/               查询包含模式的行
/pattern/pattern/         查询包含两个模式的行
pattern/,x               在给定的行号上查询包含模式的行
x,/pattern/               通过行号和模式查询匹配行
x,y!                    查询不包含指定行号x和y的行
 
sed的编辑命令
p           打印匹配行
=        显示文件行号
a\        在定位行号后附加新文件信息
i\         在定位行号后插入新的文本信息
d         删除定位行
c\         用新文本替换定位文本
s         使用替换模式替换相应模式
r         从另一个文件中读文本
w        写文本到一个文件
q         第一个模式匹配完成后退出或立即退出
l          显示与八进制ASCII代码等价的控制字符
{}         在定位行招待的命令组
n         从另一个文件中读文本下一行,并附加在下一行
g         将模式2粘贴到/pattern n/
y          传送字符
n          延续到下一输入行:允许跨行的模式匹配语句
 
sed ‘2p’ quote.txt                               打印第二行
sed –n ‘2p’ quote.txt                          打印匹配行
sed –n ‘1,3p’ quote.txt
sed –n ‘/Neave/’p quote.txt                      打印匹配Neave的行
sed –n ‘4,/The/p’ quote.txt                       打印第4 行中有The的行
sed –e ‘/music/=’ quote.txt                        打印music所在的行号
sed ‘s/night/NIGHT/’ quote.txt                   将第一个night换成NIGHT
sed ‘s/\$//’ quote.txt                            删除第一个$
sed ‘s/The/Wow!/g’ quote.txt                     将文件中所有The换成Wow!
sed –n ‘s/played/from Hockering &/p’ quote.txt       将played 换成字符串from Hockering
sed –n ‘s/played/”Hello” &/p’ quote.txt 将played      换成字符串”Hello”
 
sed常用命令集[]表空格 [ ]表示tab
‘s/\.$/g/’                    删除以.结尾的行
‘-e /abc/d’                   删除包含abc的行
‘s/[][][]/[ ]/’                 删除一个以上的空格以一个空格代替
‘s/^[][]*//g’                 删除行首空格
‘s/\.[][]*/[]/g’                删除句点后两个或更多空格,以一个空格代替
‘/^$/d’                     删除空行
‘s/^.//g’                    删除第一个字符
‘s/COL\(…\)//g’             删除紧跟COL后的三个字符
‘s/^\///g’                    从路径中删除第一个\
‘s/[]/[ ]/g’                   删除所有空格用tab代替
‘s/^[ ]//g’                   删除行首所有tab键
‘s/[ ]*//g’                   删除所有tab键
 
 第十一部分合并与分割
实用的分类sort操作

简要介绍Sort的参数

-c   测试文件是否己分类

-m   合并两个分类文件

-u   删除所有复制行

-o   存储sort结果的输出文件名

-b   使用域进行分类时,忽略第一个空格

-n   指定分类是域上的数字分类

-t   域分隔符;用非空格或tab键分融域

-r   对分类次序或比较求逆

+n   n为域号,使用此域号开始分类

n       n为域号,在分类比较时忽略此域,一般与+n一起使用

Post1    传递到mnm为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。

Sort默认为空格或多个空格为分隔符,要加入其它方式分隔,使用-t选项。

Field 0            Field 1             Field 2             Field 3

Star Wars          HK                301               4102

A Few Good Men   KL                 445               5851

head -20  file_name   20

tail -7   file_name   未尾7行    tail -f file_name   实时更新file文件(常用查看日志)

uniq

-u     只显示不重复行

-d  只显示有重复数据行,每种重复行只显示其中一行

-c  打印每一重复行出现资料

-f  n为数字,前n个域被忽略

一些系统不识别-f 选项,这时替代使用-n

join

join |options| input-file1 input-file2

an     n为文件号,m为域号。如-a1显示第一个文件的不匹配行 -a2从第二个文件中显示不匹配行

o n,m    n 为文件号,m为域号。 每个n, m必须用逗号分隔如13表示文件1第三个域

j n m    n为文件号, m为域号。使用其他域做连接域。

t        域分隔符。用来设置非空格或tab键的域分隔符。如-t:指定冒号为分隔符。

cut:从标准输入或文本文件中前切列或域。格式为cut [options] file1 file2

-c list 指定剪切字符数 -c1,5-7 剪切第一个,然后是57个字符 -c1-50剪切前50个字符

-f field  指定剪彩切域数 格式与-c相同 -f 1,5 剪切第一和第五域

-d    指定与空格和tab不同的域分隔符

paste:将按行将不同文件进行信息放在一行,默认以空格或tab为分隔符除非用-d选项指定。

paste -d -s -file1 file2

-d 指定不同的域分隔符如-d@

-s 将每个文件合并成行而不是按行粘贴

-  使用标准输入 如ls -l | paste

split:将大文件分割成小文件

split -output_file-size input-filename output-filename

     最多1000

$split bigone.txt  (2800)

xaa      1000

xab      1000

xac       800

 
第十二部分tr 用法(所有功能都可以用sed来完成,好好学学sed吧!)
第十三部分登录环境
/etc/profile
~/.profile
./logout
第十四部分环境和shell变量
变量 :可以保存路径,文件名,或数字

本地变量 只对当前用户起作用的变量。

显示变量 # echo $variable-name

清除变量或环境变量 # unset variable-name

set显示变量
设置只读变量
variable-name=value
readonly variable-name
查看只读变量 readonly
 
环境变量:一般所有环境变量均为大写,环境变量应用于用户进程前必须用export命令导出设置方法与本地变量方法相同。
 
位置变量(只读的)

$0              $1           $2           $3          $4         $5          $6       $7       $8       $9

文件名      did        you        see       the        full       moon

 
shell特定变量
$#            传递到脚本的参数个数
$*            以一个单字符串显示所有向脚本传递的参数,止选项参数可超过9个
$$            脚本运行的当前进程ID号
$!             后台运行的最后一个进程的进程ID号
$@            与$#相同,但是使用时加引号,并在引号中返回每个参数
$-             显示shell使用的当前选项,与set命令功能相同
$?             显示最后命令的退出状态,0表示没有错误,其它任何值表示有错误
 
第十五部分引号
“”          引用字符串
‘’          去掉所有特殊字符特殊含义
``          告诉脚本,这里一段shell命令
\           屏蔽特殊字符
 
第十六部分shell脚本介绍
chmod u+x xxx
./xxx
 
第十七部分条件测试
对文件,字符串和数字使用test命令
对数字和字符串使用expr命令
文件状态测试表
-d       目录
-f        正规文件
-L        符号链接
-r        可读
-s       文件长度大于0 ,非空
-w        可写
-u         文件有suid位设置
-x         可执行
[ -w scores.txt ]
 
逻辑操作符
-a              -o             !
逻辑与         逻辑或          逻辑非
 
测试数值
-eq             数值相等
-ne             数值不相等
-gt             第一个数大于第二个数
-lt              第一个数小于第二个数
-le              第一个数小于等于第二个数
-ge             第一个数大于等于第二个数
 
Expr
$expr 10 +10
20
$expr 30 / 3
10
$LOOP=0
$LOOP=’expr $LOOP + 1’
 
第十八部分控制流结构
退出状态    echo $?
流控制 if the else            case
循环     for循环       Until循环    while循环
 
if 条件1
   then 命令1
   elif 条件2
then 命令2
else 命令3
fi
注:if语句命令部分不能为空,如果没事可做那么必须加上":" 

 
case 值 in
模式1)
     命令1
     ……
     ;;
模式2)
     命令2
     …….
     ;;
模式3)
     命令3
     …..
     ;;
.
.
.
*)
缺省命令
…..
;;
Esac
 
For循环,依次执行命令
for 变量名in列表
do
   命令1
   命令2
   命令3
   命令N
done
 
until循环,直到条件为真时停止
until 条件
      命令1
      命令2
      命令n
done
 
while循环直到条件为假进停止
while 命令
do
   命令1
   命令2
   命令n
done
 
使用breakcontinue控制循环

break:此命令允许跳出循环,如在两层循环内,用break2刚好跳出整个循环。

continue:此命令类似bread命令,只是它不会跳出循环,只是跳过这个循环步。

菜单:可用于大量的屏幕输出,很方便的哦

cat << WORD

Any input

WORD

注:这个any input 可以输入好多排版漂亮的选项,而不用不停的"echo"第二个WORD前面不要有任何空格。如下

cat <<MAYDAY

-----------------------------------------------------------------------------------

user:$USER            Host:$THIS_HOST                           Date:$MYDATE

-----------------------------------------------------------------------------------

                         1:  list file in current directory

                         2:  Use the vi editor

                         3:  See who is on the system

                         H:  Help screen

                         Q:  exit Menu

-----------------------------------------------------------------------------------

MAYDAY

菜单???
 
第十九部分函数
最大作用就是可以反复调用, 可以节省大量重复劳动
函数名()
{
命令1
命令2
 
}
 
第二十部分向脚本传递参数????
第二十一部分创建屏幕输出????(目前还真用不上 )
Tupt 可以增强应用外观及脚本的控制。也可以对脚本增加颜色。可以控制光标,可以看起来更专业。

第二十二部分创建屏幕输入????(目前还真用不上 )
第二十三部分调式脚本
set –n 读命令但并不执行
set –v 显示读取的所有行
set –x 显示所有的命令及参数
 
第二十四部分shell嵌入命令(常用的命令听说是比系统里相同的命令要快,有用么?)
第二十五部分深入讨论<<
command <<word

text

Word

可以用来发邮件,连FTP,连接数据库。连接某些应用程序,也可以灵活的使用<<来运行以前编写的脚本,功能很强大。

第二十六部分shell工具
创建日志文件,
时间显示格式
$ date +%d%m%y         090699
$ date +%d-%m-%y        09-06-99
$ date +%R               10:07
$date +%A" "%R" "%p     Wednesday 10:09 AM
$ date +%T              10:29:41
$ date +%A" "%T         Wednesday    10:31:19

创建临时性文件???
信号                     信号名                   含义
1                        SIGHUP            挂起或父进程被杀死
2                        SIGINT            来自键盘的中断信号,一般是CTRL-C
3                        SIGQUIT           从键盘退出
9                        SIGKILL           无条件终止
11                       SIGSEGV           段(内存)冲突
15                       SIGTERM          软件终止(缺省杀进程信号)
检测信号:只需关心信号1、2、3和15当捕捉到一个信号后可能会有下面三种操作
1、不采取任何行动,由系统处理
2、捕获该信号,但忽略它
3、捕获信号,并采取相应行动
要采取另两种方法,必须使用trap命令,命令形式为:trap  name signal(s)常见的包括
1、清除临时文件
2、忽略此信号
3、询问用户是否终止此脚本的运行

下表是常见的trap命令的用法
trap""2 3                   忽略信号2和信号3,用户不能终此此脚本
trap"commands"2 3          如果捕捉到信号2或3,就执行相应的commands命令
trap 2 3                    复位信号2和3,用户可以终止此脚本
Logger:可以像/var/adm或/var/log中加入日志信息。从而在脚本出问题的时候可以看系统日志。此命令的一般格式为logger -p -I message
-p:为优先级,这里只涉及到提示用户注意的优先级,也是缺省值。
-i:在每个消息中记录发送消息的进程号。
第二十七部分几个脚本的例子
 
第二十八部分运行级别脚本
rc.d    rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d 
/etc/inittab
运行级别
0             停止
1             单用户模式
2             多用户模式
3           正常模式
4           用户自定义模式
5           X
6           重启
 
S 启动
K 杀死
第二十九部分cgi脚本???