读书笔记之:Linux与Unix shell编程指南v1

linux与unix Shell编程指南

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

 

第11章 合并与分割
sort,join,split,unique,cut,paste
1. sort命令
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下 sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储sort结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或 tab键分隔域。
-r 对分类次序或比较求逆。
-kn  n为域号。使用此域号开始分类。
2. 系统sort命令
3. unique命令
可以认为uniq有点像sort命令中唯一性选项。对,在某种程度上讲正是如此,但两者有一
个重要区别。 sort的唯一性选项去除所有重复行,而uniq命令并不这样做。重复行是什么?在
uniq里意即持续不断重复出现的行,中间不夹杂任何其他文本,
unique命令的选项:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前 n个域被忽略。
一些系统不识别 -f选项,这时替代使用 -n。
第12章 tr用法
tr常用命令选项:
tr -c-d-s["string1_to_translate_from"]["string2_to_trinputate_to"]file
这里:
-c用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
Input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用
1. 去除重复字符串
tr -s "[a-z]"<oops.txt
2. 删除空行
 tr -s "[\012]" <oops.txt
 tr -s "[\n]" <oops.txt
 sed 's/^$//g' oops.txt
 awk '/./ {print $0}' oops.txt
3. 大写转小写
   tr "[A-Z]" "[a-z]"<oops.txt
   tr "[:upper:]" "[:lower:]" <oops.txt
4. 删除指定字符
  tr -cs "[a-z][A-Z]" " <oops.txt
5. 转换控制字符
   tr -s "[\015\032\" "\n" <oops.txt
6. 快速转换
  如果需要删除文件中的^M,并代之以换行,使用命令:
  tr -s "[\015]" "\n" <input.file
  或者使用下述命令:
  tr -s "[\r]" "[\n]" <input.file
  也可以使用
  tr -s "\r" "\n" < input.file
  另一个一般的Dos到Unix的转换命令是:
  tr -s "[\015\032]" "[\012*]" <input.file   将所有的^M和^Z,代之以换行
  要删除所有的tab键,代之以空格,使用命令:
  tr -s "[\011]" "[\040*]" <input.file
7. 匹配多于一个字符
  可以使用[character*n]格式匹配多于一个字符
  模式为[0*4],意即匹配至少4个0,替换字符串为星号:
  tr "[0*4]" "*" <input.file
2011年8月26日 02时15分07秒
第13章 登录环境设置
登录成功后,系统执行两个环境设置文件,第一个是/etc/profile,第二个是.profile,位
于用户根目录下。
第14章 shell变量
1. 将变量并排就可以使变量的值结合在一起
2. 测试变量是否已经设置
(1)测试变量是否已经被设置或初始化
  ${varibale:-value}
(2)为变量赋予新值
  ${varibale:=value}
(3)测试变量是否取值
  ${varible:?}
  ${varible:?sorry can't locate the varible files"}
(4)测试变量是否取值,如果未设置,则返回一空串。方法如下:
${variable:+value}
使用下述方法初始化变量为空字符串。
variable=""
$DETINATION=""
3. 特定shell变量
$#    传递到脚本的参数个数
$*    以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个
$$    脚本运行的当前进程 ID号
$!    后台运行的最后一个进程的进程 ID号
$@    与$*相同,但是使用时加引号,并在引号中返回每个参数
$-    显示shell使用的当前选项,与 set命令功能相同
$?    显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。
第15章 引号
在脚本中执行变量替换时最容易犯的一个错误就是由于引号错误。在命令行中引号是很重要的。
1. 引用必要性
 shell中的引用类型:双引号,单引号,反引号,反斜线
2. 双引号
  如果要查询包含空格的字符串, 经常会用到双引号。
  使用双引号可引用除字符 $、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,
  反引号和反斜线,对shell来说,它们有特殊意义。
3. 单引号
  单引号与双引号类似,不同的是 s h e l l会忽略任何引用值。
4.反引号
 反引号用于设置系统命令的输出到变量。 s h e l l将反引号中的内容作为一个系统命令,并
 执行其内容。使用这种方法可以替换输出为一个变量。
第16章 shell脚本介绍
第17章 条件测试
1. 测试文件状态
-d    目录
-f    正规文件
-L    符号连接
-r    可读
-s    文件长度大于 0、非空
-w    可写
-u    文件有suid位设置
-x    可执行
2. 逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
3. 字符串测试
 =  两个字符串相等。
 != 两个字符串不等。
 -z 空串。
 -n 非空串。
4. 数值测试
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
第20章 向脚本传递参数
1. shift命令
第21章 创建屏幕输出
第24章 shell嵌入命令
:  空,永远返回为true
.   从当前shell中执行操作
break  退出for、while、until或case语句
cd      改变到当前目录
continue  执行循环的下一步
echo      反馈信息到标准输出
eval      读取参数,执行结果命令
exec      执行命令,但不在当前shell
exit      退出当前shell
export    导出变量,使当前shell可利用它
pwd       显示当前目录
read      从标准输入读取一行文本
readonly  使变量只读
return    退出函数并带有返回值
set       控制各种参数到标准输出的显示
shift     命令行参数向左偏移一个
test      评估条件表达式
times     显示shell运行过程的用户和系统时间
trap      当捕获信号时运行指定命令
ulimit    显示或设置shell资源
umask     显示或设置缺省文件创建模式
unset     从shell内存中删除变量或函数
wait      等待直到子进程运行完毕,报告终止
posted @ 2011-08-23 20:25  Mr.Rico  阅读(504)  评论(0编辑  收藏  举报