免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Shell_HAT
打印 上一主题 下一主题

[其他] shell技术讨论--实际工作中的应用(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
5
NBA常规赛纪念章
日期:2015-05-04 22:32:03操作系统版块每日发帖之星
日期:2015-11-09 06:20:00操作系统版块每日发帖之星
日期:2015-11-10 06:20:00数据库技术版块每日发帖之星
日期:2016-01-14 06:20:00IT运维版块每日发帖之星
日期:2016-01-16 06:20:00
41 [报告]
发表于 2014-03-28 12:39 来自手机 |只看该作者
工作需要

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
42 [报告]
发表于 2014-03-28 13:48 |只看该作者
好活动,支持一下。
到现在工作近6年了,前面三年在国企,由于工作环境和视野所限,对脚本基本忽视,一直秉承着C/C++才是语言的王道,我记得有一次,用fopen等C库函数来解析ELF文件,累死了。后来到了外企上班,才发现脚本应用之广,在这里接触到了PowerShell,VBA,VBS,Perl。
但是真正下力学的还是Perl,原因只有三个:
1:看到对面的同事学习,心里争强好胜,也要学习一下。
2:Perl语言的发明者是个语言学家,很牛的一个人,想系统学习一下Perl,领悟其编程思想。
3:用Perl作一些文本解析工作,比如我做的是汽车电子,经常会接触到CAN Message Log文件,用Perl提取其中的个别消息,那是极其便利的。


使用CANoe记录CAN消息格式如下:
0.175826 1  151             Tx   d 8 00 03 00 80 00 00 00 00  Length = 960000 BitCount = 123 ID = 337
0.184991 1  221             Rx   d 8 29 55 2E F1 00 00 00 00  Length = 928000 BitCount = 119 ID = 545
0.186886 1  161             Tx   d 8 02 FF FF FF 00 00 00 00  Length = 952000 BitCount = 122 ID = 353
其中55,2E,F1这三个位置的数据是我关心的数据,所以要将其突出显示,在两边加上中括号,并单独提出出来放到文件中,代码如下:



use strict;
my $SourceFileAddAndName1;
my $NewFileAddrAndName1;
my $SourceFileAddAndName;
my $NewFileAddrAndName;
my $CANHandle;
my $CANNewFile;
*WITH_COMMENT=\1; #特别注意常量的使用方式
*NO_COMMENT=\0;
#注意:这里使用文件句柄时带了$,只有这样才可实现文件句柄作为函数参数传递
open($CANHandle,"D:\\ReversingProblem\\4.ASC" || die "$!";
open($CANNewFile,">D:\\ReversingProblem\\4Filtered.ASC" || die "$!";
#open($CANNewFile,">D:\\NoObstacleFilted.txt" || die "$!";

#函数的四个参数意义
#FirstPara:new file handle
#SecondParadl file handle
#ThirdPara:Message ID
#FourthParam:the left distance from Rx
#FifthParam:the right distance from Rx
GetUsefulMsg($CANNewFile, $CANHandle, 161,10,19,*NO_COMMENT);

#关闭文件
close CANHandle;
close CANNewFile;


open($CANNewFile,"D:\\NoObstacleFilted.txt" || die "$!";
#处理文件的每一行
while(<$CANNewFile>
{
    my $Num2Value = GetDecValueByByteIndexAndNum(1);
    #得到一个字节的数据信息
    my $DecValue  = GetDecValueFromMsg($_,$Num2Value,1);
    #print $DecValue, "," ,$Num2Value, "...\n";

}



###############################################################
################
###############################################################

sub ProcessFileAddress
{
    my ($FileAddrAndName)=@_;
    #"\-->\\",使用正则表达式将一条反w斜线换成二条
    $FileAddrAndName=~s/\\/\\\\/;
    return $FileAddrAndName;
}

sub GetUsefulMsg
{
    my ($NewFileHandle,$SourceFileHandle,$MsgID,$StartDis,$EndDis,$CommentInfo)=@_;

    while(<$SourceFileHandle>
     {
        #两个空格中间夹着消息ID,其格式如:
        #0.175826 1  151             Tx   d 8 00 03 00 80 00 00 00 00  Length = 960000 BitCount = 123 ID = 337
        #0.184991 1  221             Tx   d 8 29 55 2E F1 00 00 00 00  Length = 928000 BitCount = 119 ID = 545
        #0.186886 1  161             Tx   d 8 02 FF FF FF 00 00 00 00  Length = 952000 BitCount = 122 ID = 353
        #其中,55,2E,F1这三个位置是要突出显示的,添加中括号突出显示效果如下:
        #0.186886 1  161             Tx   d 8 02 [FF FF FF] 00 00 00 00  Length = 952000 BitCount = 122 ID = 353
         if($_=~/\s$MsgID\s/) #正则表达式中也可以实现变量内插,MsgID就是前面的151,221,161,这些是CAN消息ID。
         {
             if($CommentInfo == *WITH_COMMENT)#如果要添加注释
             {
                 #the two line is used to comment the data
                 #使用()实现a匹配捕捉,
                 #添加中括号,以便于查看
                 #这里的\1表示小括号中的a匹配的内容,好像用$1也是可以的
                 s/Rx(.{$StartDis})/Rx\1\[/;#添加d左中括号
                 s/Rx(.{$EndDis})/Rx\1\]/;#添加右中括号
             }
             print $NewFileHandle $_;#将结果r打印到文件,注意文件句柄后面没有逗号
         }
     }
}


#first Param:the index of the request message,文件每一行的内容
sub GetDecValueByByteIndexAndNum
{
    #得到Rx在一个串中开始的索引值,因为时间长度不同,比如有的是0.001s,有的是100.111s,相应的每行文字字符串的长度也不同,
    #Rx位于字符串的位置索引也是不同的
    my ($ByteIndex)=@_;
        #查找Rx的位置。
    my $RevDis=index($_,"Rx ";
    if($RevDis != -1)
    {
       return $RevDis+9+3*$ByteIndex;
    }

    return undef;
}



#first param:message line,type $,文件每一行的内容。
#second Param:the left distance from Rx,这里是指从Rx中的“x”字符向右数,第几个位置。比如对于
Rx   d 8 29 55 2E F1 00 00 00 00,如果想要提取55这个数据,那么对应的位置就是9。
#third Param:the number,提取字节的数量,
sub GetDecValueFromMsg
{
    #得到输入参数
    my ($LineContent,$LeftDisFromRx, $ByteNum)=@_;
    #将串分割成数组,当成数字来对待
    my @ContentArray=split(//,$LineContent);

    #从CAN的8字节消息中提取数据信息,这里提取的信息可能是1,2,3,4字节,
    my $HexValue=0;
    if($ByteNum==1)
    {
       $HexValue=@ContentArray[$LeftDisFromRx].@ContentArray[$LeftDisFromRx+1];
    }
    elsif($ByteNum==2)
    {
      $HexValue=@ContentArray[$LeftDisFromRx].@ContentArray[$LeftDisFromRx+1]
               .@ContentArray[$LeftDisFromRx+3].@ContentArray[$LeftDisFromRx+4];
    }
    elsif($ByteNum==3)
    {
      $HexValue=@ContentArray[$LeftDisFromRx].@ContentArray[$LeftDisFromRx+1]
               .@ContentArray[$LeftDisFromRx+3].@ContentArray[$LeftDisFromRx+4]
               .@ContentArray[$LeftDisFromRx+6].@ContentArray[$LeftDisFromRx+7];
    }
    elsif($ByteNum==4)
    {
      $HexValue=@ContentArray[$LeftDisFromRx].@ContentArray[$LeftDisFromRx+1]
               .@ContentArray[$LeftDisFromRx+3].@ContentArray[$LeftDisFromRx+4]
               .@ContentArray[$LeftDisFromRx+6].@ContentArray[$LeftDisFromRx+7]
               .@ContentArray[$LeftDisFromRx+9].@ContentArray[$LeftDisFromRx+10];
    }
    else
    {
       $HexValue=undef;
    }
        #进制转化
    return hex($HexValue);
}

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
43 [报告]
发表于 2014-03-28 13:59 |只看该作者
话题一,你当初为什么选择了学习shell?
路过,进来学习的。
学习shell的原因,是因为工作需要。在工作当中,我需要管理一批linux操作系统的测试环境。
由于经常要在linux上面做一些重复的管理工作,所以想学习shell脚本,写一个自动化的脚本,就不用重复的去工作,这就是为什么要我学习shell.
话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
目前还是个初学者。只用写了个简单的shell脚本,堆叠的。先cd到一个目录,mvn编译。

不献丑啦,还不能独立写出比较复杂的。

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
44 [报告]
发表于 2014-03-28 14:03 |只看该作者
黑框命令符哥送我一本吧,俺初学者。。。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
45 [报告]
发表于 2014-03-28 14:47 |只看该作者
回复 44# 刺客阿地


    围绕本次的话题多分享一些吧

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
46 [报告]
发表于 2014-03-28 17:53 |只看该作者
@Shell_HAT好的,上个我写的最简单的命令堆积的脚本,只能写出这么简单的啦
#!/bin/bash
svn checkout --username xxx --password xxxx http://192.168.0.99/svn/fooouu/branches/Bhursday/Let /var/tuild/workspace/trunk2/svn/let/
cd /var/tuild/workspace/Bhursday/svn/Let/ccma_dd; /usr/local/apache-maven-3.0.4/bin/mvn  install -Dmaven.test.skip=true -Dmaven.compile.fork=true
mkdir /var/tuild/workspace/Bhursday/svn/dist
cp /var/tuild/workspace/Bhursday/svn/Let/ccma_dd/target/ccma_dd.jar /var/tuild/workspace/Bhursday/svn/dist

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
47 [报告]
发表于 2014-03-31 15:03 |只看该作者
@reyleon哟,六子大神居然还rm -rf /
我最怕这个命令了,操作需谨慎。。。。

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
48 [报告]
发表于 2014-03-31 15:07 |只看该作者
@seesea2517这才是真正的高手啊。。。shell写出俩游戏,佩服。。。。

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
49 [报告]
发表于 2014-03-31 15:25 |只看该作者
@rover12421收下了,感谢!

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
50 [报告]
发表于 2014-03-31 15:31 |只看该作者
@CUTianrui007perl提取文本霸气。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP