linux于unix shell编程指南 (1)

时间:2022-12-27 22:12:34
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