Linux Shell编程
内容均来自《Linux命令行与shell脚本编程大全》
尚待补充完整,和添加较为实际的应用案例......
初识别Linux Shell
1 #!/bin/bash 2 ############################################# 3 #获取Linux系统虚拟内存当前的状态 4 cat /proc/meminfo 5 #查看当前共享内存界面 6 ipcs -m 7 #软件程序管理 8 ps ax 9 10 #############################################
走进Shell
1 #!/bin/bash 2 ############################################# 3 #bash shell提示符字符(格式化输出提示信息到终端,也可以用于控制台程序中) 4 #详细参考博客:http://blog.itpub.net/14385647/viewspace-749630/ 5 echo $PS1 #打印当前环境变量配置 6 # \a 7 # \d 8 # \e 9 # \h 10 # \H 11 # ... 12 13 ############################################# 14 #创建链接文件 15 #硬链接:索引节点号相同:实际上是同一文件 16 cp -l test1 test2 #创建了一个指向test1的硬链接文件test2 17 ls -il 18 #软链接:索引节点号不一样:是两个文件但是软链接文件很小,只存储了源文件的信息 19 cp -s test1 test3 20 ls -il 21 #移动有软链接文件的文件,这个链接文件会失效;而对硬链接文件无影响 22 23 ############################################# 24 #查看文件的命令 25 cat 26 more 27 less 28 tail 29 head
常用Bash Shell命令
#!/bin/bash ############################################# #监测程序 ps ############################################# #查看磁盘使用 df #查看所有磁盘使用 du #查看特定目录的磁盘使用 ############################################# #处理数据文件 cat file1 sort -n file1 #识别数字并排序 sort -M file1 #识别月份并排序 #搜索数据 grep three file1 #搜索包含three子字段的字段 #数据压缩 bzip2 compress gzip zip #归档数据 tar
构建基本脚本
1 #!/bin/bash 2 #chapter 10 3 ################################## 4 # #管道 5 # #为选择内容添加注释Ctrl+Shift+/ 6 # dpkg -l | sort | more 7 8 ################################## 9 # #arithmetic 10 # #获取文件属主权限 chmod u+x filename 11 # #expr command 12 # #mind that there must be space bewteen number and methematical symbol,some symbols need using \ 13 # #使用expr是为了与Bourne shell保持兼容,只能进行整数运算 14 # expr 1 + 5 15 16 # expr 5 \* 2 17 18 # var1=10 19 # var2=20 20 # var3=`expr $var1 / $var2` 21 # echo The result is $var3 22 23 # #方括号 square brackets 24 # var4=5 25 # var5=$[$var4 * ($var2 - $var1)] 26 # echo The result is $var5 27 28 # #浮点解决方案 bc(bash counter) 29 # var6=`echo "scale=5; 3.44 / 5" | bc` 30 # echo The answer is $var6 31 32 # var7=`bc << EOF 33 # scale=4 34 # a1=($var1 * $var2) 35 # b1=($var4 * $var6) 36 # a1 + b1 37 # EOF 38 # ` 39 # echo The final answer is $var7 40 41 ################################## 42 # #退出脚本 43 # #$?查看上个命令退出状态码 44 # date 45 # echo $? 46 47 # #exit command 48 var1=10 49 exit $va1 50 51 ##################################
使用结构化命令
1 #!/bin/bash 2 #chapter11 结构化命令 3 ################################## 4 #if-then语句 退出状态码为0,执行then后面的语句 5 # if date 6 # then 7 # echo "execute the command behind of then" 8 # fi 9 10 # if [[ date ]]; then 11 # echo "execute the command behind of then" 12 # fi 13 14 # #查找某特定用户是否在当前系统上使用 15 # testuser=seeker 16 # if [[ grep $testuser /etc/passwd ]]; then 17 # if grep $testuser /etc/passwd 18 # then 19 # if grep $testuser /etc/passwd; then 20 # echo the bash file for user $testuser are: 21 # ls -a /home/$testuser/.b* 22 # fi 23 24 ################################## 25 #test 命令 数值比较/字符串比较(= != < > -n -z)/文件比较(-d file -e flie -f -r -s -w -x -O -G file1 -nt file2 file1 -ot file) ,注意保持[]与条件的距离 26 #test命令只能处理整数的比较,字符串比较是比较首字母的ASCLL码的大小 27 # var1=10 28 # var2=11 29 30 # if [ $var1 -eq $var2 ]; then 31 # echo "The value $var1 is equal to var2" 32 # elif [ $var1 -gt $var2 ]; then 33 # echo "The value $var1 is larger than $var2" 34 # elif [ $var1 -lt $var2 ]; then 35 # echo "The value $var1 is smaller than $var2" 36 # fi 37 38 # var3=Testing 39 # var4=testing 40 # if [ $var3 \> $var4 ]; then 41 # echo "$var3 is greater than $var4" 42 # else 43 # echo "$var3 is less than $var4" 44 # fi 45 46 ################################## 47 # #复合条件测试 空文件apace file 48 # #相关命令 mkdir rm vi touch 49 # logfile=$HOME/filename 50 # touch u+w $logfile 51 # if [ -d $HOME ] && [ -w $HOME/filename ]; then 52 # #statements 53 # if [ -x $logfile ]; then 54 # #statements 55 # fi 56 # fi 57 58 ################################## 59 # #if-then的高级特性 60 # #使用双尖括号 可以使用高级数学表达式 val++ val-- ++val --val ! ~ ** << >> & | || && 61 # #test只允许在比较中使用简单的算数操作 62 # val5=10 63 # if (( $val5 ** 2 > 90 )); then 64 # (( val6 = val5 ** 2 )) 65 # fi 66 67 # #使用双方括号 标准字符串比较,模式匹配 68 # #针对字符串比较的高级特性,相关应用正则表达式 69 # if [[ $USER == s* ]]; then 70 # echo "Hello $USER" 71 # else 72 # echo "No this user" 73 # fi 74 75 ################################## 76 #case命令 77 #相关命令 whois whoami who w finger 网址:http://daaoao.blog.51cto.com/2329117/614698 78 case $USER in 79 seeker | barbara ) 80 echo "Welcome,$USER";; 81 testing) 82 echo "Special testing account" ;; 83 *) 84 echo "Sorry,you are not allowed here" ;; 85 esac 86 ##################################
更多的结构化命令
1 #!/bin/bash 2 #结构化命令 3 ############################################# 4 # #for循环:注意符号"'"需要使用\转义或者使用双引号定义使用了此单引号的值;包含有空格的值需要使用双引号扩起来 5 # #默认使用空格当作各个词的分界线 6 # for test in I don\'t know if "this'll" work, let\'s see "New York"; do 7 # echo "word: $test" 8 # done 9 10 ############################################# 11 # #从变量中读取列表 12 # list="a b c d e f" 13 # list=$list" g" 14 # for letter in $list; do 15 # echo "Have you learned $letter?" 16 # done 17 # echo ${list} h 18 19 ############################################# 20 # #从命令读取值 21 # #相关命令 touch 在当前目录下建立新文档 vi i进入插入模式,Esc退出插入模式 22 # #倒引号``表示括住的内容为命令 shell中一些特殊符号功能详见 www.cnblogs.com/xuxm2007/archive/2011/10/20/2218846.html 23 # file="chapter12tex" 24 # for state in `cat $file`; do 25 # echo "Vist beautiful $state" 26 # done 27 28 ############################################# 29 #用通配符读取目录 30 # for file in /home/seeker/mydisk/myrepo/seekershell/Source_LSP/* ; do 31 # if [ -d "$file" ]; then 32 # echo "$file is a directory" 33 # elif [ -f "$file" ]; then 34 # echo "$file is a file" 35 # fi 36 # done 37 38 ############################################# 39 #更改字段分隔符 40 41 42 ############################################# 43 # #C语言风格的for命令 44 # #给变量赋值可以有空格;条件中的变量不宜美元符开头;迭代过程的算式未用expr命令 45 # #可以使用多个变量 46 # for (( i = 0; i < 10; i++ )); do 47 # echo "The next number is $i" 48 # done 49 50 # for (( i = 1, b=10; i <= 10; i++, b-- )); do 51 # echo "$i - $b" 52 # done 53 54 ############################################# 55 # #wile命令 使用多个测试命令 56 # var1=10; 57 # while echo $var1 58 # [ $var1 -ge 0 ]; do 59 # echo "this is inside the loop" 60 # var1=$[ $var1 - 1 ] 61 # done 62 63 ############################################# 64 # #until命令 65 # #也可使用多个测试命令 66 # var2=100 67 # until echo $var2 68 # [ $var2 -eq 0 ]; do 69 # echo inside the loop: $var2 70 # var2=$[ $var2 - 25 ] 71 # done 72 73 ############################################# 74 var3=5 75 while [ $var3 -ge 0 ] 76 do 77 echo "Outer loop: $var3" 78 for (( var4 = 1; $var4 < 3; var4++ )); do 79 var5=$[ $var3 * $var4 ] 80 echo " Inner loop: $var3 * $var4 = $var5" 81 done 82 var3=$[ $var3 - 1 ] 83 done 84 85 ############################################# 86 #控制循环 87 #break 88 #continue 89 90 ############################################# 91 #处理循环的输出 92 for (( i = 0; i < 10; i++ )); do 93 echo "The number is $i" 94 done > test.txt 95 echo "The command is finished." 96 #done | sort 97 98 #############################################
处理用户输入
1 #!/bin/bash 2 ####################################### 3 # #命令行参数 4 # #当脚本中的参数超过9后,需要在第9个变量的数字周围添加花括号,${10} 5 # factorial=1 6 # for (( i = 1; i <= $1; i++ )); do 7 # factorial=$[ $factorial * $i *$2 ] 8 # done 9 # echo The factorial of $1 and $2 is $factorial 10 11 # total=$[ ${10} * ${11} ] 12 # echo The tenth parameter is ${10} 13 # echo The eleventh parameter is ${11} 14 # echo The total is $total 15 16 # #读取程序名,basename命令的作用:不显示当前程序的完整路径名,只显示程序名 17 # name=`basename $0` 18 # echo The command entered is: $name 19 20 # name=`basename $0` 21 # if [ $name = "chapter13" ];then 22 # total=$[ $1 + $2 ] 23 # elif [ $name = "chapter12" ]; then 24 # total=$[ $1 * $2 ] 25 # fi 26 # echo The calculated value is $total 27 28 ####################################### 29 #测试参数 30 #运行脚本前判断是否需要加参数, -n检测变量中是否含有数据 31 if [ -n "$1" ]; then 32 echo Hello $1, glad to meet you. 33 else 34 echo "Sorry, you did not identify yourself." 35 fi 36 ####################################### 37 #特殊参数变量 38 39 ####################################### 40 ####################################### 41 #######################################
控制脚本
1 #!/bin/bash 2 #控制脚本 3 4 ############################# 5 #最常见的Linux信号:SIGHUP/SIGINT/SIGQUIT/SIGKILL/SIGTERM/SIGSTOP/SIGTSTP/SIGCONT 6 # 1 2 3 9 15 17 18 19 7 # hang up/ 8 #生成信号 9 #Ctrl+C 生成 SIGINT信号 如 $sleep 10 会等待10秒,按Ctrl+C会立刻返回 10 #Ctrl+Z 生成 SIGTSTP信号,停止shell中运行的任何进程,使用 $ps 查看停止的作业,加上au参数可以查看详细信息 11 #重新启动已经停止的任务 $bg 作业号 12 13 #捕捉信号 trap命令 trap commands signals (可以用于有先后顺序的两个任务的自动执行) 14 trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT SIGTERM #SIGTERM什么用? 15 echo This is a test program 16 count=1 17 while [ $count -le 10 ]; do #-le检测count是否小于或等于10 18 echo "Loop #$count" 19 sleep 3 20 count=$[ $count + 1 ] 21 done 22 echo This is the end of the test program 23 24 #捕捉脚本的退出 signals改为EXIT即可 trap commands EXIT 退出时执行commands (可以用于有先后顺序的两个任务的自动执行) 25 26 # #移除捕捉, 27 # trap - EXIT 28 29 ############################# 30 #以后台模式运行脚本(针对运行时间较长又不想见到它的程序) 31 #在需要后台运行的脚本后面加上 & 32 #可以同时运行多个后台作业 33 34 ############################# 35 #在非控制台下运行脚本 36 #nohup命令 $nohup ./filename & 37 #使用此命令运行的脚本会忽略任何终端发过来的SIGHUP信号 38 #此命令会将文件执行的结果重定向到一个名为 nohup.out 的文件中 39 40 #进程状态 41 # D 不可中断 Uninterruptible sleep (usually IO) 42 # R 正在运行,或在队列中的进程 43 # S 处于休眠状态 44 # T 停止或被追踪 45 # Z 僵尸进程 46 # W 进入内存交换(从内核2.6开始无效) 47 # X 死掉的进程 48 49 # < 高优先级 50 # N 低优先级 51 # L 有些页被锁进内存 52 # s 包含子进程 53 # + 位于后台的进程组; 54 # l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 55 56 ############################# 57 #作业控制
初识sed和gawk
1 #!/bin/bash 2 #文本处理 3 4 #sed命令 5 #文本替换,sed 命令不会保存修改的内容, 6 sed 's/dog/cat/' testfile18 7 #sed -n 's/cat/dog' testfile18 #不要为每个命令生成输出,等待print命令来输出 8 9 #同时执行多个命令options:-e; 分号可以使用bash中的次提示符来分隔命令; 10 sed -e 's/brown/green/;s/dog/cat/' testfile18 11 12 #从文件中读取命令,针对有大量处理命令,可以将这些处理命令存放在文件中 13 sed -f script18 testfile18 >> testfile18pro 14 15 #gawk命令 16 #gawk options program file 17 #自动修改文本文件 18 #功能: 定义变量保存数据 19 # 使用算术和字符串操作符来处理数据 20 # 使用结构化编程概念,增加逻辑 21 # 提取数据文件中数据元素并将他们按另一顺序或格式放置,生成格式化报告 22 23 #从命令行读取程序脚本 24 gawk '{print "Hello John"}' #和sed编辑器一样,gawk程序会针对数据流中的每行文本执行一遍程序脚本。 25 #终止gawk:Ctrl+D (EOF) 26 #数据字段变量 $0 $1 $2 …… $n 27 # $0表示整个数据字段 28 #显示文本文件中每行的第1数据字段值 29 gawk '{print $1}' 30 #显示其他文件中的字段 -F 31 gawk -F : '{print $1}' /etc/passwd #此处以:为分隔符 32 #如何指定字段的分隔符;默认的分隔符是什么? 33 34 35 #在程序脚本中使用多个命令 36 echo "My name is Rich" | gawk '{$4="Christine"; print $0}' #输出结果是 My name is Christine 37 #此处的echo并不会打印出结果,需要加上print $0 38 39 #从文件中读取程序 40 gawk -F: -f gawk_script /etc/passwd #从程序脚本gawk_script中调取程序 41 42 #指定程序脚本何时运行,BEGIN 关键字后指定的程序脚本会在gawk读取数据前强制执行 43 gawk 'BEGIN {print "Hello World!"}' 44 gawk 'BEGIN {print "The script18 File Content:"} { print $0 }' script18 45 46 #在处理数据后运行脚本 47 gawk 'BEGIN {print "The script18 File Content:"} {print $0} END {print "END of File"}' script18 48 49 50 #sed编辑器基础 51 52 #替换标记 命令 s/pattern/replacement/flags 53 # n 表示新文本将会替换每行第几处模式匹配的文本 54 # g 表明新文本将会替换所有已有文本出现的地方 55 # p 表示原来行的内容要打印出来 56 # w file ,将替换的结果写到文件中 57 sed 's/test/trial/' sed_testfile1 #只能替换每行中出现的第一个word1 58 sed 's/test/trial/2' sed_testfile1 #将每行中第二个出现的test字段替换为trial 59 sed 's/test/trial/g' sed_testfile1 60 sed 's/test/trial/w sed_testfile2' sed_testfile1 61 62 #替换字符 63 #对于一些文本字符串中的字符不方便在替换模式中使用的情况。例如:正斜线/,在文本中为字符,但是在sed中常用做分隔符,所以需要\转义. 64 #如替换/etc/passwd中的/bin/bash为/bin/csh,命名如下 65 sed ‘s/\/bin\/bash/\/bin\/csh/’ /etc/passwd 66 #sed编辑器允许使用其他字符作为substitute命令中的字符串分隔符,如下面使用感叹号作为分隔符 67 sed ‘s!/bin/bash!/bin/csh!’ etc/passwd 68 69 #使用地址,为了使命令作用于特定的某行或某些行 70 #格式: 71 # [address]command 72 # address{ 73 # command1 74 # command2 75 # command3 76 # } 77 # 数字方式的行寻址 78 sed '2s/dog/cat/' testfile18 >> testfile18pro 79 sed '2,3/dog/cat/' testfile18 >> testfile18pro #2-3行 80 sed '2,$/dog/cat/' testfile18 >> testfile18pro #从第2到最后一行 81 82 #使用文本模式过滤器 83 #格式: /pattern/command 84 grep seeker /etc/passwd 85 sed '/seeker/s/bash/csh/' /etc/passwd 86 87 #组合命令 88 sed '2{ #指定第2行 89 > s/fox/elephant/ 90 > s/dog/cat/ 91 >}' testfile18 92 sed '2,${ 93 >s/brown/green/ 94 >s/lazy/active/ 95 >}' testfile18 96 97 #删除行 98 sed 'd' testfile18 #删除所有行 99 sed '3d' testfile18 #删除第3行 100 sed '2,3d' testfile18 101 sed '2,$d' testfile18 102 #使用模式匹配匹配并删除相应行 103 sed '/lazy cat/d' testfile18pro #删除包含lazy cat的行 104 #使用文本模式匹配删除范围中的行 105 sed '/num 1/,/number 4/d' sedDelt 106 #注意必须使删除操作最后能够停止,否则整个数据流都被删掉了 107 108 #插入和附加文本 109 #insert:在指定行前加一个新行 110 #append: 在指定行后加一个新行 111 echo "test line 2" | sed 'i\test line 1' 112 echo "test line 2" | sed 'i\test line 1' 113 sed '6a\new line 7' sedDelt 114 sed '$a\new line 7' sedDelt 115 #插入或者附加多行文本 116 sed '1i\ 117 >insert a line\ 118 >insert another line' sedDelt 119 sed '1i\insert a line\ninsert another line' sedDelt #\n换行符 120 121 #修改行 122 #change命令允许修改数据流中整行文本的内容。 123 sed '2c\changed line of text' sedDelt 124 sed '/number 3/c\change line include number 3' sedDelt #修改匹配的任意行 125 sed '2,3c\changed line of text' sedDelt 126 127 #转换命令 128 #唯一可以处理单个字符的sed编辑器命令,对所有行有效 129 sed 'y/123/678/' sedDelt #1->6 2->7 3->8 130 131 #回顾打印 132 #打印行 133 echo "this is a test" | sed 'p' 134 sed -n '/num 1/p' sedDelt #只打印匹配字段num 1的行,没有-n的话会先把原来的打印一遍再把匹配的打印一遍 135 sed -n '2,3p' sedDelt 136 sed -n '/3/{p;s/num/test/p}' sedDelt 137 #打印行号 138 sed '=' sedDelt 139 sed -n '/num 1/{=;p}' sedDelt #打印匹配num 1的行号和行内容 140 141 #列出行 142 sed -n 'l' sedDelt #打印格式是通过输出格式控制符和转义控制码表示的,最后的$表示换行符 143 144 #使用sed和文件一起工作 145 #向文件写入 146 sed -n '1,2w test' sedDelt #将sedDelt文件中的前两行打印到test文件中 147 sed -n '/num/w INcustomers' sedDelt 148 #从文件中读取数据 149 sed '3r data' sedDelt 150 sed '/num 1/r data' sedDelt 151 sed '$r data' sedDelt 152 sed '/number/{r data;d}' sedDelt 153 154 #(完整版)
正则表达式
1 #!/bin/bash 2 #成功使用sed和gawk程序的关键是熟练使用正则表达式。 3 4 #正则表达式的类型 5 #Linux下两种流行的正则表达式引擎: 6 #POSIX基本正则表达式(BRE) 7 # #纯文本,区分大小写 8 # echo "This is a test" | sed -n '/this/p' 9 # echo "This is a test" | sed -n '/This/p' 10 # echo "This is line number 1" | sed -n '/ber 1/p' 11 # sed -n '/ /p' sedDelt #匹配多个空格 12 13 # #特殊字符 .*[]^s{}\+?|() 14 15 # #不能在文本模式中单独使用特殊字符 16 # #若要用特殊字符作为文本字符必须使用反斜杠\转义 17 # sed -n '/\$/p' data 18 # echo "\ is a sepcial character" | sed -n '/\\/p' 19 # #斜杠/也需要转义 20 # echo "3/2" | sed -n '/\//p' 21 22 # #锚字符 23 # #锁定在行首:脱字符^,定义从数据流中每个文本行的行首开始的模式 24 # echo "The book store" | sed -n '/^book/p' #不匹配 25 # echo "Books are great" | sed -n '/^Book/p' #匹配 26 # echo "This ^ is a test" | sed -n '/s ^/p' #脱字符放在除了行首其他位置则当普通字符对待,这里也是匹配的 27 28 # #锁定在行尾:美元符$,定义数据行必须以此文本模式结尾 29 # echo "There are a lot of good books" | sed -n '/books$/p' 30 31 # #组合锚点 32 # sed -n '/^this/p;/test.$/p' data #这两个筛选条件是或的关系 33 # sed -n '/^this is a test.$/p' data 34 # #使用两个锚点直接组合过滤空白行 35 # sed '/^$/d' data 36 37 # #点字符 . :可以匹配任意的单字符,除了换行符。点字符必须匹配一个字符,若此位置无字符,模式不成立 38 # sed -n '/.est/p' data 39 40 # #字符组:使用[] 41 # #限定匹配特定某些字符 42 # sed -n '/[ch]at/p' data 43 # sed -n '/[ ][dD]at/p' data #[][]是对连续的两个字符进行分别匹配 44 # sed -n '/[0123]/p' data 45 # sed -n '/^[0-9][0-9][0-9][0-9]$/p' data #匹配只有四位数字的行 46 # #排除字符组:加脱字符^后,找不匹配[]中字符的行 47 # sed -n '/[^ch]at/p' data 48 49 # #使用区间 单破则号- 50 # sed -n '/[c-h]at/p' data 51 # sed -n '/[a-ch-m]at/p' data #匹配a-c和h-m之间的字符 52 53 # #特殊字符组 54 # # [[:alpha:]] #匹配任意字母字符,不管大小写 55 # # [[:alnum:]] #匹配任意字母数字字符0-9/A-Z/a-z 56 # # [[:blank:]] #匹配空格或制表符 57 # # [[:digit:]] #匹配0-9之间的数字 58 # # [[:lower:]] #匹配小写字母a-z 59 # # [[:print:]] #匹配任意可打印字符 60 # # [[:punct:]] #匹配标点符号 61 # # [[:space:]] #匹配任意空白字符 62 # # [[:upper:]] #匹配任意大写字母字符A-Z 63 # echo "abc" | sed -n '/[[:digit:]]/p' 64 # echo "abc" | sed -n '/[[:alpha:]]/p' 65 66 # #星号 * 67 # #字符后放*,说明该字符会在匹配模式文本中出现0次或多次 68 # #广泛用于处理有常见拼写错误或不同语言中有拼写变种的单词 69 # echo "ik" | sed -n '/ie*k/p' #打印ik 70 # echo "ieeek" | sed -n '/ie*k/p' 71 # echo "I'm getting a color TV" | sed -n '/colou*r/p' 72 # echo "I'm getting a colour TV" | sed -n '/colou*r/p' 73 74 # #.与*组合,匹配任意字符 75 # echo "this is a regular pattern expression" | sed -n '/regular.*expression/p' 76 77 # echo "baat" | sed -n '/b[ae]*t/p' 78 79 #POSIX拓展正则表达式(ERE) 80 #问号:类似于星号 81 #问号表明前面的字符可以出现0次或1次。 82 # echo "bet" | gawk '/be?t/{print $0}' 83 # echo "bt" | gawk '/be?t/{print $0}' 84 # echo "beeeet" | gawk '/be?t/{print $0}' #无输出 85 # echo "baet" | gawk '/b[ae]?t/{print $0}' #无输出 86 # echo "baet" | gawk '/b[a]?[e]?t/{print $0}' 87 88 # #加号+ 89 # #表明前面的字符出现1次或多次 90 # echo "beeeet" | gawk '/be+t/{print $0}' 91 # echo "beaeat" | gawk '/b[ae]+t/{print $0}' 92 93 # #花括号 94 # #为可重复的正则表达式指定一个上限。通常称为区间 95 # echo "bt" | gawk --re-interval '/be{1}t/{print $0}' 96 # echo "bet" | gawk --re-interval '/be{1}t/{print $0}' #只能出现一次 97 # echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}' #只能出现1-2次 98 99 # echo "baet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}' 100 # echo "baeaet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}' 101 # echo "baeaet" | gawk --re-interval '/b[ae]{1,5}t/{print $0}' #两个字符加起来1-5个 102 103 # #管道符号|:允许匹配时使用逻辑OR进行模式匹配 104 # echo "The cat is asleep" | gawk '/cat|dog/{print $0}' 105 # echo "The dog is asleep" | gawk '/cat|dog/{print $0}' 106 # echo "He has a hat" | gawk '/[ch]at|dog/{print $0}' 107 108 # #聚合表达式() 109 # #正则表达式也可以使用()聚合起来。当你聚合正则表达式模式时,该组就会被当成标准字符。 110 # #你可以给该组使用特殊字符,就跟你给正常字符使用一样。 111 # echo "Satday" | gawk '/Sat(urday)?/{print $0}' #判断()中内容是否出现0次或1次,是则匹配 112 # echo "Saturday" | gawk '/Sat(urday)?/{print $0}' 113 # echo "Saturdayurday" | gawk '/Sat(urday)?$/{print $0}' 114 # echo "bab" | gawk '(c|b)a(b|t)/{print $0}' 115 116 #实用中的正则表达式 117 #目录文件计数 118 # echo $PATH 119 # mypath=`echo $PATH | sed 's/:/ /g'` 120 # count=0 121 # for directory in $mypath #默认是以空格作为分隔符的 122 # do 123 # check=`ls $directory` 124 # for item in $check 125 # do 126 # count=$[ $count + 1 ] 127 # done 128 # echo "$directory - $count" 129 # count=0 130 # done 131 132 #验证电话号码 133 cat phoneNumText | gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}/{print $0}' 134 135 cat phoneNumText | gawk --re-interval '/^\(?[2-9][0-9]{2}\)?( |-|\.)?[0-9]{3}( |-|\.)[0-9]{4}/{print $0}' 136 137 #解析邮件地址 138 #Email格式:username@hostname 139 #username可以是字母/数字/点号/单破则号/加号/下划线 140 #hostname可以是一个或多个域名和一个服务器名组成,域名和服务器名可以是字母/数字/点号/下划线,顶级域名只是字母。 141 gawk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@(a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'
sed进阶
gawk进阶
使用数据库
使用web
使用E-mail
编写脚本实用工具
shell脚本编程进阶