Shell脚本

4 756 vues

Publié le

0 commentaire
3 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
4 756
Sur SlideShare
0
Issues des intégrations
0
Intégrations
782
Actions
Partages
0
Téléchargements
29
Commentaires
0
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Shell脚本

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

×