• 1. Linux下Shell编程进阶
  • 2. Shell编程中常用符号输出/输入重导向 >      >>   <   <<   :>   &>   2&>   2<>>&   >&2    文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。 常用的文件描述符如下: 文件描述符          名称         常用缩写     默认值      0               标准输入      stdin            键盘      1               标准输出      stdout         屏幕      2            标准错误输出   stderr          屏幕 我们在简单地用<或>时,相当于使用 0< 或 1> * cmd > file 把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。 * cmd >> file 把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。 * cmd < file 使cmd命令从file读入
  • 3. Shell编程中常用符号管道符号: | cmd 1 | cmd2 把cmd1命令的输出做为cmd2的输入 逻辑符号 : && || ! cmd1 && cmd2 cmd1命令执行成功则执行cmd2,否则不执行 cmd1 || cmd2 cmd1命令执行成功,不执行cmd2,否则执行 ! cmd 排除指定范围
  • 4. Shell编程中常用符号引用符号: “ ” ‘ ’ ` ` 双引号“、”:把引号之内的字符视为普通字符,但‘、’、/、$、`除外 单引号:把引号之内的字符视为普通字符,无例外 倒引号:执行引号内的内容 转义字符: / 有时我们需要对一些特殊字符进行操作,可以在之前输入转义字符,暂时取消或拥有该特殊字符的特殊功能,做为一个普通字符使用。 变量引用字符:$ 引用变量,$符号在shell用有好些用法。后面跟变量名为引用变量,在正则表达式中为定位行尾的元字符
  • 5. 正则表达式一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
  • 6. 正则表达式 ^ 匹配输入字符串的开始位置。 $ 匹配输入字符串的结束位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。 * 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的“do” 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
  • 7. 正则表达式{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 (pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
  • 8. 正则表达式 已知str=‘uid=100(guest) gid=100(others) groups=10(users),11(floppy)’ 现在想要得到这个字符串中的第一个括号内的值,即guest该怎么办?假设$str的括号外的内容是不固定的,不能依据uid之类的关键字或空格去查找,所依据的只能是找第一对括号内的内容。 echo $str|sed ‘s/[^(]*(\([^)]*\)).*/\1/’ 在SHELL编程中,一段好的脚本和一段完美的脚本的差别之一,就是要熟知正则表达式并学会使用它们,用一条命令抽取一段文本和用三四条命令得到同样的结果要节省许多时间
  • 9. SED命令sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。 sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 Sed识别任何基本正则表达式和模式及其行匹配规则
  • 10. SED命令Sed命令参数
  • 11. SED命令Sed例程: sed - i ‘s/192.168.54.250/192.168.13.14/’ /opt/avcon/avcond/conf/avcond.xml 把avcond.xml文件中的192.168.54.250改为13.14 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符” sed = filename | sed 'N;s/\n/\t/' 只在行中出现字串“baz”的情况下将“foo”替换成“bar” sed '/baz/s/foo/bar/g' 显示包含“AAA”、“BBB”或“CCC”的行 sed '/AAA/!d; /BBB/!d; /CCC/!d‘
  • 12. SED命令 删除文件中的所有空行 sed ‘/^$/d’ 删除文件中的所有注释行 sed ‘/^#/d’ 注释掉符合条件的行,比如注释包含USER字符的行 sed ‘/USER/s/^/#/’ 在匹配行前插入 sed -i '/pattern/ i "插入字符串"' filename 在匹配行后插入 sed -i '/pattern/ a "插入字符串"' filename
  • 13. AWK命令任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。 模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。 模式可以是任何条件语句或复合语句或正则表达式
  • 14. AWK命令一般的使用格式是: awk '{pattern + action}' {filenames} 他有个-F参数,自己定义分隔符,比如awk -F : ‘{print $1}’这个就是自己定义冒号为分隔符。 如果不用-F,默认表示用空格分隔区域 $0 $1 $2 $3 $4 $5....表示位置变量,$0表示整个文件 $1文件里的第一个块(区域) str=‘uid=100(guest) gid=100(others) groups=10(users),11(floppy)’ echo $str | awk -F'[()]' '{print $2" "$4" "$6" "$8}'
  • 15. 动手写个守护进程 #!/bin/bash rsmcu=`ps -A | grep rsmcu` rsmcush=`cat /etc/rc.local | grep RsAvcon` if [ "$rsmcu" = "" ]; then date >> /var/log/check.log echo avcond is stoped! >> /var/log/check.log $rsmcush sleep 5 confirm=`ps -A | grep rsmcu` if [ -z "$confirm" ]; then echo rsmcu start error! >> /var/log/check.log else echo rsmcu is restarted! >> /var/log/check.log fi fi
  • 16. 附:crond crontab -l 列出目前所有的计划任务 crontab -e 编辑计划任务 crontab -r 删除所有添加的计划任务 * * * * * path/cmd 分 时 日 月 周
  • 17. 谢谢!