Script-  文本分析 [email_address] 行 / 块 / 工程化脚本命令
script  特点 0.  在脚本中,懂得正则是必须的,要不你会“寸步难行”。 1. linux shell  个人认为比较严格的说他是多种命令工具的组合  如: find,awk,sed,grep ,cut ,split,find,crontab 等。 2.  perl  文本处理的王者  如: perl  -ne  ' print  if  /(.*?)=(.*)/;'  file.txt 读取 file.txt  满足  key=value  格式的数据,并输出 . 3.  python  工程和万能胶 语言  curl : py 环境中引入  pycurl  就可以直接使用  C 级别的抓取包 R :  开源的统计语言,引入  rpy2  4.  其他 erlang , jython, javascript ,sql ...
正则学习  -  统配符 1.  正则数量  x?  =  x{0,1}  x* = x{0,}  x+  = x{1,}  ;  x{m}  ;  x{n,m} 2. []  匹配符合  ;  [^]  匹配不符合 [0-9]  匹配所有数字字符  [^0-9]  匹配所有非数字字符  $  匹配字符结尾的字符  \d  匹配一个数字的字符,和  [0-9]  语法一样  ;  \D  \w  英文字母或数字的字符串,和  [a-zA-Z0-9]  语法一样  ;  \W  \s  空格,和  [\n\t\r\f]  语法一样  ;  \S  \b  匹配以英文字母 , 数字为边界的字符串  ; \B  a|b|c  匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串
正则学习 一些特殊正则元字符说明 : 1. *?  和  +?  和  {n,}?  懒惰匹配  echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (.*)\d /;'  #print ab2c12 echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (.*?)\d /;'  #print ab 2.  回溯引用和前后查找 :   2.1  向前查找  (?=..)  echo &quot;ab2c121a&quot; |perl -ne 'print $1 if  /(.*?)(?=2)/ ;'  #print ab   2.2  向后查找  (?<=..)  echo &quot;ab2c121a&quot; |perl -ne 'print $1 if  /(?<=2)(.*)(?=2)/ ;'  #print c1   2.3  负向 - 前 / 后 查找  (?!..) (?<!..)  echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (?<!2)(c.*) /;'  #print  无 echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (?<!3)(c.*) /;'  #print c121a   2.4  条件  ?()  = if  ?()| = if else   echo &quot;<p>xx</p>&quot;|perl -ne 'print $2  if / (<p>)?(\w*)(?(1)<\/p>) /'  #print  xx   echo &quot;<p>xx&quot;|perl -ne 'print $2,&quot;\n&quot; if / (<p>)?(\w*)(?(1)<\/p>) /'  #print  空 echo &quot;xx&quot;|perl -ne 'print $2 if / (<p>)?(\w*)(?(1)<\/p>) /'    #print xx   echo &quot;<p>xx1</p>&quot;|perl -ne 'print $2  if / (<p>)?(\w*)(?(1)<\/p>|\d) /'  #print xx1   echo &quot;<p>xx1&quot;|perl -ne 'print $2  if / (<p>)?(\w*)(?(1)<\/p>|\d) /'  #print xx
正则语言匹配 中文正则匹配参考 :  >>> print re.match(ur&quot;.*[\u4e00-\u9fa5]+&quot;,u&quot;hi, 匹配到了 &quot;) <_sre.SRE_Match object at 0x2a955d9c60> >>> print re.match(ur&quot;.*[\u4e00-\u9fa5]+&quot;,u&quot;hi,no no&quot;) None
linux txt shell find 一些实例: find . -name  &quot;*mp3&quot; -size +300000c -exec rm -f  {} \;  删除音源转换失败文件(小于  300k ) find  /logs  -type f -mmin  -2 -print  最近 2 分钟修改过的日志 find . -type f  -exec  cat  {} \;  |perl  -ne  'print if /(.*?)=(.*)/;'  当前文件夹下数据满足 key,value 输出
linux txt  截取 , 统计 , 排序 $>cut,sort,uniq   $> last |head  -n 1 # 列出目前与过去登入系统的用户相关信息 hadoop  pts/3  192.168.101.103  Tue Nov 24 11:43  still logged in  $>last | cut -d ' ' -f1 | sort | uniq -c |sort -t' ' +1nr  23 hadoop 19 xj_sunch 11 xj_wangs 9 lky   ......... #> 在日志中 上面这条预计算  pv,uv  就很简单了 #> 参考: #> 注意 在  shell  中输出  <tab>  =  <ctrl+v+i>  :  cut -d '<tab>' -f2,3,5
linux txt  join $>echo &quot;x:2:4&quot; > f1 $>echo &quot;y:a:2&quot; > f2 #  我们需要要  f1.2 列 和  f2.3 列  join #  并输出  f1.1  和  f2.2 #  内连 $>join  -t &quot;:&quot; -1 2 f1  -2 3 f2 -o 1.1,2.2 #  输出  x:a #  其他  leftjoin,rightjoin  参考  join --help
linux txt  其他 head , tail , grep ,wc ,cat  wget ,curl  comm  ,diff  两个有序的文件进行比较 语法对比与 C
perl  txt 语法帮助:  1. perl  -MEncode -ne 'print decode(&quot;GBK&quot;,$_);'  file.txt  # utf-8  转  gbk tt=$( echo &quot; 中文邮件标题 &quot; | perl  -MEncode -ne 'print  encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))'  ) mail -s $tt  liukaiyi@xunjienet.com  < /tmp/ip_sta.crontab.log.gbk 2. echo &quot;ABC1C2cGJ&quot; |perl -ne 'tr/[A-Z]/[a-z]/; print ;'  # 大小写转换  3. echo &quot;ABC 123&quot; > te ; perl -i -pe 's/ABC/abc/g' te ; cat te #  原文件替换  abc 123 4.  复列输出 : cat xx.txt | awk -F&quot;  &quot; 'a[$1]++'  或者  :  cat xx.txt |perl -F&quot;\t&quot; -ane  '$a{$F[1]}++;END{ while(($k,$v)=each(%a)){ print &quot;$k = $v \n&quot;; } }' 结果比如: 百度手机在线  = 7  中兴  = 2  ..... 还比如:查看各用户 有多少个进程 ps -ef |perl  -ane  '$a{$F[0]}++;END{ while(($k,$v)=each(%a)){ print &quot;$k = $v \n&quot;; } }'
perl txt 计算  Top 10  关键字  并把源数据有关  top10  的全部输出 perl -e  ' my $num=10; # top 10  open(MYFILE, &quot;<$ARGV[0]&quot;); open(MYFILE2, &quot;<$ARGV[0]&quot;); #  关键字列数 while(<MYFILE>){@lis=split /\|<>\|/;$fck{$lis[1]}++ } foreach $k (  sort { $fck{$b} <=> $fck{$a} }  keys %fck){ if(++$row>$num){last; } $arr[@arr] = $k; } while(<MYFILE2>){@lis=split /\|<>\|/;  if(  grep { $arr[$_] eq $lis[1] } 0..$#arr){  # print &quot;$fck{$lis[1]}:$_&quot;; # 带 关键字出现次数输出 print ; }  } ' qdSearch.log
python txt 语法参考: http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/pythonhtml/html/toc/index.html python pdb  基础调试 http://www.blogjava.net/Skynet/archive/2009/04/07/264259.html Berkeley DB  http://www.blogjava.net/Skynet/archive/2009/08/20/291917.html sqlite3  http://www.blogjava.net/Skynet/archive/2009/04/23/267084.html 验证码识别 http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html 上面组合  >  抓取 百度 TOP500  并计算增量 http://www.blogjava.net/Skynet/archive/2009/05/06/269164.html
实例 -1 压力测试  url  tt=$(date +%s) for ((i=1;i<10000;i++)) ; do wget  -q http://10.26.*.**:***/**.html  --post-data  &quot;logname=download2.log&logdata=at=<|>aip=.....&quot;  - O   /dev/null done echo $(date +%s)-$tt ; # 当然如果有“登入”那引入  py 中的  curl , 验证码识别 , 代理等
实例 -2 mail  发中文邮件 cat /tmp/ip_sta.crontab.log |perl  -MEncode -ne 'print  encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))' > /tmp/ip_sta.crontab.log.gbk title=$( echo &quot;xxx- 用户操作日报 &quot; | perl  -MEncode -ne 'print  encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))'  ) mail -s $title  -c  抄送人 @xunjienet.com  收件人 @xunjienet.com  < /tmp/ip_sta.crontab.log.gbk
实例 -3 脚本查看数据库中状态,进行处理 isgg=$(eval &quot;mysql -uroot database  -e \&quot;select count(*) from  tableX  \&quot; |sed -n '2p' &quot;) if [ &quot;$isgg&quot; = &quot;0&quot; ];then eval  &quot; mysql  --default-character-set=utf8  xxx  -e  \&quot; update  table  ...where ..  \&quot; &quot;;
数据 -4 数据库格式化导出 eval &quot; mysql  -uroot --default-character-set=utf8  -e \&quot; select  col1 , col2 ,col 3 ...,'','','','','' from xtable where de3='xx.log' and  ... \&quot; | sed -n '2,\$p'  |perl -ne 's/\t/<\|>/g;print ;'  >  $topath/downcomp.log &quot; # at=value<|>cid=value<|>eref=value<|>
实例 -5 Pexpect  可以用来和像  ssh 、 ftp 、 passwd 、 telnet  等命令行程序进行自动交互  ;  参考 scp :  child = pexpect.spawn('scp lky@10.x.x.x:/tmp/xx  .  ') child.expect ('Password:') child.sendline (mypassword) SSH  : import paramiko  client = paramiko.SSHClient()  client.load_system_host_keys()  ip = '192.168.100.6'  client.connect(ip, username='root', password='mima')  i, o, e = client.exec_command('svn  update ')  print o.read(), e.read()  client.close()

Shell脚本

  • 1.
    Script- 文本分析[email_address] 行 / 块 / 工程化脚本命令
  • 2.
    script 特点0. 在脚本中,懂得正则是必须的,要不你会“寸步难行”。 1. linux shell 个人认为比较严格的说他是多种命令工具的组合 如: find,awk,sed,grep ,cut ,split,find,crontab 等。 2. perl 文本处理的王者 如: perl -ne ' print if /(.*?)=(.*)/;' file.txt 读取 file.txt 满足 key=value 格式的数据,并输出 . 3. python 工程和万能胶 语言 curl : py 环境中引入 pycurl 就可以直接使用 C 级别的抓取包 R : 开源的统计语言,引入 rpy2 4. 其他 erlang , jython, javascript ,sql ...
  • 3.
    正则学习 - 统配符 1. 正则数量 x? = x{0,1} x* = x{0,} x+ = x{1,} ; x{m} ; x{n,m} 2. [] 匹配符合 ; [^] 匹配不符合 [0-9] 匹配所有数字字符 [^0-9] 匹配所有非数字字符 $ 匹配字符结尾的字符 \d 匹配一个数字的字符,和 [0-9] 语法一样 ; \D \w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 ; \W \s 空格,和 [\n\t\r\f] 语法一样 ; \S \b 匹配以英文字母 , 数字为边界的字符串 ; \B a|b|c 匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串
  • 4.
    正则学习 一些特殊正则元字符说明 :1. *? 和 +? 和 {n,}? 懒惰匹配 echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (.*)\d /;' #print ab2c12 echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (.*?)\d /;' #print ab 2. 回溯引用和前后查找 : 2.1 向前查找 (?=..) echo &quot;ab2c121a&quot; |perl -ne 'print $1 if /(.*?)(?=2)/ ;' #print ab 2.2 向后查找 (?<=..) echo &quot;ab2c121a&quot; |perl -ne 'print $1 if /(?<=2)(.*)(?=2)/ ;' #print c1 2.3 负向 - 前 / 后 查找 (?!..) (?<!..) echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (?<!2)(c.*) /;' #print 无 echo &quot;ab2c121a&quot; |perl -ne 'print $1 if / (?<!3)(c.*) /;' #print c121a 2.4 条件 ?() = if ?()| = if else echo &quot;<p>xx</p>&quot;|perl -ne 'print $2 if / (<p>)?(\w*)(?(1)<\/p>) /' #print xx echo &quot;<p>xx&quot;|perl -ne 'print $2,&quot;\n&quot; if / (<p>)?(\w*)(?(1)<\/p>) /' #print 空 echo &quot;xx&quot;|perl -ne 'print $2 if / (<p>)?(\w*)(?(1)<\/p>) /' #print xx echo &quot;<p>xx1</p>&quot;|perl -ne 'print $2 if / (<p>)?(\w*)(?(1)<\/p>|\d) /' #print xx1 echo &quot;<p>xx1&quot;|perl -ne 'print $2 if / (<p>)?(\w*)(?(1)<\/p>|\d) /' #print xx
  • 5.
    正则语言匹配 中文正则匹配参考 : >>> print re.match(ur&quot;.*[\u4e00-\u9fa5]+&quot;,u&quot;hi, 匹配到了 &quot;) <_sre.SRE_Match object at 0x2a955d9c60> >>> print re.match(ur&quot;.*[\u4e00-\u9fa5]+&quot;,u&quot;hi,no no&quot;) None
  • 6.
    linux txt shellfind 一些实例: find . -name &quot;*mp3&quot; -size +300000c -exec rm -f {} \; 删除音源转换失败文件(小于 300k ) find /logs -type f -mmin -2 -print 最近 2 分钟修改过的日志 find . -type f -exec cat {} \; |perl -ne 'print if /(.*?)=(.*)/;' 当前文件夹下数据满足 key,value 输出
  • 7.
    linux txt 截取 , 统计 , 排序 $>cut,sort,uniq $> last |head -n 1 # 列出目前与过去登入系统的用户相关信息 hadoop pts/3 192.168.101.103 Tue Nov 24 11:43 still logged in $>last | cut -d ' ' -f1 | sort | uniq -c |sort -t' ' +1nr 23 hadoop 19 xj_sunch 11 xj_wangs 9 lky ......... #> 在日志中 上面这条预计算 pv,uv 就很简单了 #> 参考: #> 注意 在 shell 中输出 <tab> = <ctrl+v+i> : cut -d '<tab>' -f2,3,5
  • 8.
    linux txt join $>echo &quot;x:2:4&quot; > f1 $>echo &quot;y:a:2&quot; > f2 # 我们需要要 f1.2 列 和 f2.3 列 join # 并输出 f1.1 和 f2.2 # 内连 $>join -t &quot;:&quot; -1 2 f1 -2 3 f2 -o 1.1,2.2 # 输出 x:a # 其他 leftjoin,rightjoin 参考 join --help
  • 9.
    linux txt 其他 head , tail , grep ,wc ,cat wget ,curl comm ,diff 两个有序的文件进行比较 语法对比与 C
  • 10.
    perl txt语法帮助: 1. perl -MEncode -ne 'print decode(&quot;GBK&quot;,$_);' file.txt # utf-8 转 gbk tt=$( echo &quot; 中文邮件标题 &quot; | perl -MEncode -ne 'print encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))' ) mail -s $tt liukaiyi@xunjienet.com < /tmp/ip_sta.crontab.log.gbk 2. echo &quot;ABC1C2cGJ&quot; |perl -ne 'tr/[A-Z]/[a-z]/; print ;' # 大小写转换 3. echo &quot;ABC 123&quot; > te ; perl -i -pe 's/ABC/abc/g' te ; cat te # 原文件替换 abc 123 4. 复列输出 : cat xx.txt | awk -F&quot; &quot; 'a[$1]++' 或者 : cat xx.txt |perl -F&quot;\t&quot; -ane '$a{$F[1]}++;END{ while(($k,$v)=each(%a)){ print &quot;$k = $v \n&quot;; } }' 结果比如: 百度手机在线 = 7 中兴 = 2 ..... 还比如:查看各用户 有多少个进程 ps -ef |perl -ane '$a{$F[0]}++;END{ while(($k,$v)=each(%a)){ print &quot;$k = $v \n&quot;; } }'
  • 11.
    perl txt 计算 Top 10 关键字 并把源数据有关 top10 的全部输出 perl -e ' my $num=10; # top 10 open(MYFILE, &quot;<$ARGV[0]&quot;); open(MYFILE2, &quot;<$ARGV[0]&quot;); # 关键字列数 while(<MYFILE>){@lis=split /\|<>\|/;$fck{$lis[1]}++ } foreach $k ( sort { $fck{$b} <=> $fck{$a} } keys %fck){ if(++$row>$num){last; } $arr[@arr] = $k; } while(<MYFILE2>){@lis=split /\|<>\|/; if( grep { $arr[$_] eq $lis[1] } 0..$#arr){ # print &quot;$fck{$lis[1]}:$_&quot;; # 带 关键字出现次数输出 print ; } } ' qdSearch.log
  • 12.
    python txt 语法参考:http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/pythonhtml/html/toc/index.html python pdb 基础调试 http://www.blogjava.net/Skynet/archive/2009/04/07/264259.html Berkeley DB http://www.blogjava.net/Skynet/archive/2009/08/20/291917.html sqlite3 http://www.blogjava.net/Skynet/archive/2009/04/23/267084.html 验证码识别 http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html 上面组合 > 抓取 百度 TOP500 并计算增量 http://www.blogjava.net/Skynet/archive/2009/05/06/269164.html
  • 13.
    实例 -1 压力测试 url tt=$(date +%s) for ((i=1;i<10000;i++)) ; do wget -q http://10.26.*.**:***/**.html --post-data &quot;logname=download2.log&logdata=at=<|>aip=.....&quot; - O /dev/null done echo $(date +%s)-$tt ; # 当然如果有“登入”那引入 py 中的 curl , 验证码识别 , 代理等
  • 14.
    实例 -2 mail 发中文邮件 cat /tmp/ip_sta.crontab.log |perl -MEncode -ne 'print encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))' > /tmp/ip_sta.crontab.log.gbk title=$( echo &quot;xxx- 用户操作日报 &quot; | perl -MEncode -ne 'print encode(&quot;GBK&quot;, decode(&quot;UTF-8&quot;,$_))' ) mail -s $title -c 抄送人 @xunjienet.com 收件人 @xunjienet.com < /tmp/ip_sta.crontab.log.gbk
  • 15.
    实例 -3 脚本查看数据库中状态,进行处理isgg=$(eval &quot;mysql -uroot database -e \&quot;select count(*) from tableX \&quot; |sed -n '2p' &quot;) if [ &quot;$isgg&quot; = &quot;0&quot; ];then eval &quot; mysql --default-character-set=utf8 xxx -e \&quot; update table ...where .. \&quot; &quot;;
  • 16.
    数据 -4 数据库格式化导出eval &quot; mysql -uroot --default-character-set=utf8 -e \&quot; select col1 , col2 ,col 3 ...,'','','','','' from xtable where de3='xx.log' and ... \&quot; | sed -n '2,\$p' |perl -ne 's/\t/<\|>/g;print ;' > $topath/downcomp.log &quot; # at=value<|>cid=value<|>eref=value<|>
  • 17.
    实例 -5 Pexpect 可以用来和像 ssh 、 ftp 、 passwd 、 telnet 等命令行程序进行自动交互 ; 参考 scp : child = pexpect.spawn('scp lky@10.x.x.x:/tmp/xx . ') child.expect ('Password:') child.sendline (mypassword) SSH : import paramiko client = paramiko.SSHClient() client.load_system_host_keys() ip = '192.168.100.6' client.connect(ip, username='root', password='mima') i, o, e = client.exec_command('svn update ') print o.read(), e.read() client.close()