2011年8月23日 20时24分36秒
linux于unix shell编程指南
第一章 文件安全与权限
chmod 改变权限
suid/guid: suid意味着如果某个用户对属于自己的 shell脚本设置了这种权限,那么其他用户在执行这
一脚本时也会具有其属主的相应权限。于是,如果根用户的某一个脚本设置了这样的权限,
那么其他普通用户在执行它的期间也同样具有根用户的权限。同样的原则也适用于 g u i d,执
行相应脚本的用户将具有该文件所属用户组中用户的权限。
chown与chgrp改变所有者
umask 文件默认是(666-umask) 目录默认是(777-umask)
第二章 使用find和xargs
Find命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
pathname find命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec
find命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ' c o m m -
and' {} \;,注意{}和\;之间的空格。
-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,
在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
常用的命令选项:
-name 按文件名查找文件
-type 查找某一类型的文件
b - 块文件
d - 目录
c - 字符设备文件
l - 符号链接文件
f - 普通文件
第3章 后台执行程序
&永远将程序放在后台运行
利用ps命令和grep命令找出相应的进程。
hohup命令:该命令可以让你再退出账户之后继续运行相应的进程。一般形式
nohup command &
使用nohup时可以将输出重定向到一个文件
第4章 文件名置换
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。
当shell遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样
用户就可以用它们来匹配相应的文件名。
第5章 shell的输入与输出
必须使用- n选项来禁止echo命令输出后换行:
必须使用-e选项才能使转义符生效:
管道的使用
sed、awk和grep都很适合用管道,特别是在简单的一行命令中。
文件重定向
常用文件重定向命令
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中 (追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准输出重定向到一个文件中 (追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中 (追加)
command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到 delimiter分界符
command <&m 把文件描述符 m作为标准输入
command >&m 把标准输出重定向到文件描述符 m中
command <&- 关闭标准输入
如果要创建一个长度为0的空文件,可以使用">filename"
结合使用标准输出和标准错误:如
cat file1 file2 1>file.out 2>file.err
合并使用标准输出和标注错误
cleanup >cleanup.out 2>&1
第6章 命令执行顺序
1. &&命令:command1 && command2
||命令
类似逻辑与或操作
2. 用()和{ }将命令结合在一起
为了在当前 s h e l l中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令用圆括号()括起来。
它的一般形式为:
(命令1;命令2;...)
如果使用 { }来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{ }中所有
命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。
它的一般形式为:
{命令1;命令2;...}
第7章 正则表达式介绍
1. 基本元字符集及其含义
^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟 *,匹配0个或多个此单字符
[] 只匹配 [ ]内字符。可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用 [1-5]代替[12345]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有特殊含义。 \可以使其失去应有意义
. 只匹配任意单字符
pattern\{n\} 只用来匹配前面 pattern出现次数。 n为次数
pattern\{n,\}m 只含义同上,但次数最少为 n
pattern\{n,m\} 只含义同上,但 pattern出现次数在 n与m之间
匹配空行:^$
匹配只有一个字符的行:^.$
经常使用的正则表达式举例
^ 对行首
$ 对行尾
^[the] 对以the开头行
[Ss]igna[lL] 对匹配单词signal、signaL 、Signal、SignaL
[Ss]igna[lL]\. 对同上,但加一句点
[mayMAY] 对包含 m a y大写或小写字母的行
^USER$ 对只包含USER的行
[tty]$ 对以tty结尾的行
\. 对带句点的行
^d..x..x..x 对用户、用户组及其他用户组成员有可执行权限的目录
^[^l] 对排除关联目录的目录列表
[.*0] 对0之前或之后加任意字符
[000*] 对000或更多个
[iI] 对大写或小写I
[iI][nN] 对大写或小写i或n
[^$] 对空行
[^.*$] 对匹配行中任意字符串
^......$ 对包括6个字符的行
[a- zA-Z] 对任意单字符
[a-z][a-z]* 对至少一个小写字母
[^0-9\$] 对非数字或美元标识
[^0-0A-Za-z] 对非数字或字母
[123] 对1到3中一个数字
[Dd]evice 对单词device或Device
De..ce 对前两个字母为 D e,后跟两个任意字符,最后为 ce
\^q 对以^q开始行
^.$ 对仅有一个字符的行
^\.[0-9][0-9] 对以一个句点和两个数字开始的行
'"Device"' 对单词device
De[Vv]ice\. 对单词Device或device
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 对日期格式dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 对IP地址格式nnn. nnn.nnn.nnn
[^.*$] 对匹配任意行
第8章 grep家族
1. grep一般格式为:
grep [选项]基本正则表达式 [文件]
注意:(1)在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:"mystring" 。这样做
有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串
在调用变量时,也应该使用双引号,诸如: grep“$MYVAR”文件名,如果不这样,没有返回结果。
(2)在调用模式匹配时,应使用单引号
2.
常用的grep选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
-E 允许使用扩展模式匹配
3. 查询多个文件:grep "sort it" *
4. 精确匹配是在字符串后加\>, 如:grep "48\>" data.f
5. 在grep中使用正则表达式:
使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。
6 类名
[[:upper:]]
[[:lower:]]
[[:digit:]]
[[:alpha:]]
[[:alnum:]]
[[:space:]]
第9章 awk介绍
1. awk 使用方式
awk [-F field-separator] 'command' inputfiles
-F 指定分隔符
2. awk 执行方法
awk是每次执行一行,对一行的每个域进行处理,处理完后再去执行下一行
3. awk中使用条件操作符
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以if语句。 awk中if后面的条件用()括起来。
4. awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
5.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) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的 exp
sub(r,s) 用$0中最左边最长的子串代替 s
substr(s,p) 返回字符串 s中从p开始的后缀部分
substr(s,p,n) 返回字符串 s中从p开始长度为 n的后缀部分
6. 在awk中使用printf
7. 书写awk脚本
第一行#!/bin/awk -f
2011年8月24日 21时03分35秒
第10章 sed用法介绍
1. sed匹配方式
行号(范围)和模式匹配
2. 创建sed脚本文件
(1) 利用脚本文件,及a\命令往文件中添加文本
如:
#!/bin/sed -f
$ a\
fasfasd\
fasdf
再最后一行添加文本
(2) i\命令是插入文本,与a\类似
(3) c\替换命令,不过这儿可以指定所要替换行的范围
3. sed命令
p 打印匹配行
= 显示文件行号
d 删除定位行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制 ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
4. 替换文本命令
格式为:
[address[,address]]s/pattern-to-find/replacement-pattern/[g p w n]
g 缺省情况下只替换第一次出现模式,使用 g选项替换全局所有出现模式。
p 缺省sed将所有被替换行写入标准输出,加 p选项将使 - n选项无效。 - n选项不打印输 结果。
w 文件名 使用此选项将输出定向到一个文件。
5. 使用系统sed命令
(1)处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
sed中在某个字符串前或后添加字符串使用&命令
sed 's/Mr/& Bruce /g' 在Mr之后添加Bruce
5. 使用系统sed命令
(1)处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
sed中在某个字符串前或后添加字符串使用&命令
sed 's/Mr/& Bruce /g' 在Mr之后添加Bruce
5. 使用系统sed命令
(1)处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
sed中在某个字符串前或后添加字符串使用&命令
sed 's/Mr/& Bruce /g' 在Mr之后添加Bruce
5. 使用系统sed命令
(1)处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
sed中在某个字符串前或后添加字符串使用&命令
sed 's/Mr/& Bruce /g' 在Mr之后添加Bruce
5. 使用系统sed命令
(1)处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
sed中在某个字符串前或后添加字符串使用&命令
sed 's/Mr/& Bruce /g' 在Mr之后添加Bruce
sed 's/Mr/Bruce &/g' 在Mr之前添加Bruce