发布新日志

  • vim 编码方式(encoding、fileencoding、fileencodings、termencoding介绍)

    2012-02-21 13:35:29

    vim 编码方式的设置

    和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是,和很多来自 Linux 世界的软件一样,这需要你自己动手设置。

    Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:

    * encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会 自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).

    * fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。

    * fileencodings: Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。

    * termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term 的编码.这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。

    好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看 Vim 的多字符编码方式支持是如何工作的。

    1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。

    2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式。

    3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。

    4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;)。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代码页)。


  • 网络传输时间

    2011-03-10 14:12:51

    长1Km。10Mbps的基带总线LAN,信号传播速度为200M/us,计算一个1000比特的帧从发送到接收结束的最大时间是多少

    发送和接收需要时间,速度是10Mbps;传播也需要时间,速度200M/us;不过第一个比特到达接收端时,1000比特还没发送完,所以不是 (帧发送时间+传播时间+帧接收时间),因为中间有重叠。

    开始之后1000/10Mbps = 100us,帧的最后一个比特刚好完成发送,再过1km/(200m/us)=5us最后一个比特传播到接收端,接收端再用1/10Mbps = 0.1us收完这最后一个比特。就接收结束,整个费时100us+5us+0.1us = 105.1us.

    ps.这是在没考虑冲突的情况下得最大时间。

    我觉得1000b在发送前要处理时间和接受完的时间应该相等(不考试其他因素),所以100应该*2吧????
    1000b/(10*10^6)b/s*10^6*2+5US=205us????

    2个相等没错,但不是一个做完,另一个才开始做。
    当1帧在发送端还没发完的时候,就已经有部分传播到接收端开始接收了。有重叠。

    这也是设计二层协议的时候要考虑的地方,有一个最小长度限制,一桢没完全发完就有部分到达,便于检测到冲突做处理:)

    - 千里孤行

  • 【shell】uniq的用法

    2011-03-09 11:57:43

    [root@stu100 ~]# cat test

      boy took bat home

      boy took bat home

      girl took bat home

      dog brought hat home

      dog brought hat home

      dog brought hat home

      看test文件的内容,可以看到其中的连续重复行

      [root@stu100 ~]# uniq test

      boy took bat home

      girl took bat home

      dog brought hat home

      uniq命令不加任何参数,仅显示连续重复的行一次

      [root@stu100 ~]# uniq -c test

      2 boy took bat home

      1 girl took bat home

      3 dog brought hat home

      -c 参数显示文件中每行连续出现的次数。

      [root@stu100 ~]# uniq -d test

      boy took bat home

      dog brought hat home

      -d选项仅显示文件中连续重复出现的行。

      [root@stu100 ~]# uniq -u test

      girl took bat home

      -u选项显示文件中没有连续出现的行。

      [root@stu100 ~]# uniq -f 2 -s 2 test

      boy took bat home

      忽略每行的前2个字段,忽略第二个空白字符和第三个字段的首字符,结果at home

      [root@stu100 ~]# uniq -f 1 test

      boy took bat home

      dog brought hat home

      忽略每行的第一个字段,这样boy ,girl开头的行看起来是连续重复的行。

  • sed常用命令实例

    2011-03-06 23:04:23

    sed常用命令实例


    删除:d命令
    *
    $ sed '2d' example-----删除example文件的第二行。
    *
    $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
    *
    $ sed '$d' example-----删除example文件的最后一行。
    *
    $ sed '/test/'d example-----删除example文件所有包含test的行。
    替换:s命令
    *
    $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
    *
    $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
    *
    $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
    *
    $ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
    *
    $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
    选定行的范围:逗号
    *
    $ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
    *
    $ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
    *
    $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
    多点编辑:e命令
    *
    $ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
    *
    $ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
    从文件读入:r命令
    *
    $ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
    写入文件:w命令
    *
    $ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
    追加命令:a命令
    *
    $ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
    插入:i命令
    $ sed '/test/i\\
    new line
    -------------------------' example
    如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
    下一个:n命令
    *
    $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
    变形:y命令
    *
    $ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
    退出:q命令
    *
    $ sed '10q' example-----打印完第10行后,退出sed。
    保持和获取:h命令和G命令
    *
    $ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
    保持和互换:h命令和x命令
    *
    $ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
    7. 脚本
    Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
  • Linux下头文件和库文件搜索路径

    2011-01-13 15:33:04

    Include的header文件、库文件,总共有下列来源指定gcc去哪里找:

    1.在编译时指定的(在~gcc/gcc/collect2.c:locatelib()

    2.写在specs内的

    3.后来用-D -I -L指定的

    4.gcc环境变量设定(编译的时候)

    5.ld.so的环境变量(这是run time的时候)

     

    下面详细说明gcc环境变量指定:

    一、头文件

    gcc 在编译时如何去寻找所需要的头文件 :

    ※所以header file的搜寻会从-I开始

    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

    ※再找内定目录

    /usr/include

    /usr/local/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g -3

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

    库文件但是假如装gcc的时候,是有给定的prefix的话,那么就是

    /usr/include

    prefix/include

    prefix/xxx-xxx-xxx-gnulibc/include

    prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

    二、库文件

    cos()等函式库的选项要多加 -lm

    编译的时候:

    ※gcc会去找-L

    ※再找gcc的环境变量LIBRARY_PATH

    ※再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

    三、运行时动态库的搜索路径

    1、在配置文件/etc/ld.so.conf中指定动态库搜索路径

    2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

    3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。

    这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)

    4、默认的动态库搜索路径/lib

    5、默认的动态库搜索路径/usr/lib

    可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,

    再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,

    如此往复,将可得到Linux搜索动态库的先后顺序。

    程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示

    程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式

    ./ ./libpos.so 编译目标代码时指定的动态库搜索路径

    /root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

    /root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径

    /lib /lib/libpos.so 默认的动态库搜索路径/lib

    /usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib

    综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

    1.编译目标代码时指定的动态库搜索路径;

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib。

    参考文件:http://www.xker.com/page/e2008/0220/49692.html

  • linux下svn的用法

    2010-05-05 14:07:56

    场景:
    写了新的testcase,需要上传至svn
    step1. 在svn中创建目录: svn mkdir -m "making a new dir..." http://...../newdirname
    step2. 将新建的目录check out出来: svn co http://...../newdirname
    step3. 将写好的testcase拷贝到该目录下
    step4. 进入newdirname目录,将testcase添加到svn控制(预定添加到版本库): svn add *
    step5. 将testcase上传至版本库: svn ci * -m "add your comments...."
    说明:如果在step4后,又对testcase做了修改,之后再ci会出现问题,此时需要使用svn revert取消对版本库的预定,然后再重新预定、上传即可。
  • 【ZT】AWK/shell/bash变量问题汇总

    2010-02-24 16:04:21

     

    awk中使用shell的环境变量
    一:"'$var'"
    这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:
    var="test"
    awk 'BEGIN{print "'$var'"}'
    这种写法其实际是双括号变为单括号的常量,传递给了awk.
    如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
    var="this is a test"
    awk 'BEGIN{print "'"$var"'"}'
    二:'"$var"'
    这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.
    三.把括起awk程序的''变为"",使用"$var"
    如:
    $var="this is a test"
    awk 'BEGIN{print "$var"}"
    这是因为在""里$是特殊字符,而在''里$是普通字符.
    四:export 变量,使用ENVIRON["var"]形式,
    如:
    $var="this is a test";export $var
    awk 'BEGIN{print ENVIRON["var"]}'
    五:当然也可以使用-v选项
    如:
    $var="this is a test"
    awk -vnvar="$var" '{print nvar}'
    这样便把系统变量定义成了awk变量.

    二.在awk中给系统变量附值

     eval $(awk 'BEGIN{print "a=ggg b=3"}')

    eval $(grep -v '#' "$CONFFILE" | awk 'BEGIN{FS="|"} NR=="'$var

  • SecureCRT客户端频繁超时问题

    2009-11-25 14:46:09

    由于客户端、服务器端存在路由器、防火墙,为了本身的安全性,在超过特定时间后会把空闲连接断开。

    解决办法:

    1.可以修改服务器端参数,使服务器每隔一段时间向客户端发送一个消息,用于保持连接。

    /etc/ssh/sshd_config 文件中的ClinetAliveInterval 300(默认为0)

    2.最好的办法是修改客户端设置,使客户端每隔一段时间向服务器发送一个消息,以保持连接:

    SecureCRT选项->会话选项->终端->反空闲,设置每隔多少秒发送一个字符串或者发送NO-OP协议包。

  • awk的学习和使用(四)

    2009-08-18 23:09:26

     
    在本系列的(一)中,学习了以下几个部分:
    awk的三种调用方式:命令行式、使用-f选项调用awk文件、将#!/bin/awk -f添加到awk文件首行。
    awk语法
    awk的记录、字段和内部变量
    awk的内置函数
    awk的自定义变量
     
    下面将继续学习后面的部分:awk的运算与判断awk的流程控制awk中的正则表达式awk与shell的混合编程
     
    一、awk的运算与判断
    awk支持多种运算,这些运算与c中的基本相同。
    运算符:+、-、*、/、%、++、--、+=、-=、=+、=-等;
    运算函数:log、sqr、cos、sin、length、substr等;
    条件测试:==、!=、>、<、>=、<=等;
    逻辑运算符:!、&&、||、()等;
     
    二、awk的流程控制
    BEGIN和END
    在awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

    例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

    $awk
    >'BEGIN { FS=":";print "统计销售金额";total=0}
    >{print $3;total=total+$3;}
    >END {printf "销售金额总计:%.2f",total}' sx
    (注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠\)

    在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

    流程控制语句
    awk提供了完备的流程控制语句,其用法与C语言类似:
    if...else语句
    while语句
    do-while语句
    for语句
     
    三、awk中的正则表达式
    对于awk而言正则表达式是置于两个正斜杠之间、由字符组成的模式。正则表达式位于awk语法中的pattern。如果输入行中的某个字符串与正则表达式相匹配,则最终条件为真,于是执行与该表达式关联的所有操作如果没有指定操作则打印与正则表达式匹配的记录
    例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
    $awk '/sun/{print}' mydoc
    由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
    $awk '/sun/' mydoc
    例:下面是一个较为复杂的匹配的示例:
    $awk '/[Ss]un/,/[Mm]oon/ {print}' myfile
    它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
    如何查找第一个字段匹配正则的行?
    例子:查找第一个字段中带有sun字符串的行,并打印;
    $awk -F"\t" '$1~/sun/{print $1 "\t" $2}' filename 
    awk中逗号分隔的两个pattern,表示对满足第一个pattern,到满足第二个pattern之间的行(包括满足pattern1的行,不包括满足pattern2的行),执行action操作。如我们常用的:
    awk 'NR==2,NR==5 {print $0} myfile'
    表示打印第二行到第四行。

     
    四、awk与shell的混合编程
    1.awk读取Shell script程序变量
    在awk中我们可以通过“'$变量名'”的方式读取sell scrpit程序中的变量。
    例:在下面的示例中,我们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。 
    下面给出两种方式:
    第一种比较常用的方式:(双引号和单引号的意义需要明确)
    #!/bin/sh
    name='John'
    awk '{print $1,$2,"'$name'"}' myfile
    -------------------------------------------------
    第二种方式:
    #!/bin/sh
    name='John'
    awk '{print $1,$2,myname}' myname=$name myfile
    不过这种方式中,awk自定义变量myname不能在BEGIN中使用。
     
    2.将shell命令的执行结果送给awk处理
    作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:
    例:示例awk处理shell命令的执行结果
    $who -u | awk '{printf("%s正在执行%s\n",$2,$1)}'
    该命令将打印出注册终端正在执行的程序名。

    3.shell script程序读awk的执行结果
    shell中可以将awk执行结果赋值给shell变量。我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。
    下面给出变量名=`awk语句`的方式(注释,awk语句必须使用键盘左上角的反引号引起来。)
    下例为:找出myfile中带有fail字符串的行并统计行数,最后打印出格式为:there are (行数) lines
    #!/bin/sh
    temp=`awk '/fail/{print $0}' myfile |wc -l`
    echo "there are $temp lines" 

    3.还有其他shell、awk混合编程的方式,由于本人对shell不是很熟,请参见原文吧。
  • Linux下的常用命令(不断整理中)

    2009-08-18 13:46:28

    1.合并两个文件:cat file1, file2 > file3

    2.清屏clear;客户端乱码时:reset;

    3.查看用户登录日志:who -u /var/log/wtmp  (也可以用last查看)

    4.统计记录行数: wc -l

    5.查找:find 路径 -name 文件/目录名

    6.显示隐藏文件(.开头的文件一般会被隐藏):ls -al 或者直接 ll

    7.查找rpm包安装路径 rpm -qlp xxx.rpm 或者rpm -ql xxx

      查找已安装的rpm包:rpm -qa|grep xxx

      查询一个已经安装的文件属于哪个软件包:rpm -qf 文件名 
      查看一下已安装软件所依赖的软件包及文件:rpm -qR 软件名

      查看未安装rpm包的信息,只要在上面的命令中多加一个参数p,比如:rpm -qpR ***.rpm

    8.在后台运行程序:后面加& 或者前面加 nohup
    9.ll -t 按修改时间倒序 (ll --help 查看)
      ll -rt 按修改时间正序
    10.xargs用法:
      ps -aux|grep "httpd"|grep -v "grep" |awk '{print $1}'|xargs kill 说明:把grep出来的结果,传给xargs执行kill操作;
    11.下载:wget url 举例:wget url -O filename.htm 
    12.cat /proc/version 查看版本信息
      cat /etc/issue 查看版本信息带有update信息
      uname -a 查看所有系统信息
      uname -r 查看kernel release
      uname -v 查看kernel version
      uname -p 查看处理器32位、46位
    13.文件编码转换:iconv -c -f utf-8 -t gbk file 将utf8编码的转成gbk编码
    14. 替换字符串:sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`
    15.tee [-ai][--help][--version][文件...]  读取标准输入的数据,并将其内容输出成文件
    16. ls 2>&1 1>/dev/null 将错误信息输出到标准输出,将标准输出的其他信息输出到黑洞;
    17. rpm 卸载 rpm -e xx --nodeps
    18. 查看磁盘剩余空间: df -hl
    19. sar -r -5 -10 表示监控内存,并且每5秒取一个结果,一共取10个结果,sar是监控所有进程的资源占用情况,如果需要个别进程,可以使用ps aux |grep 方式

    20. top输出重定向有问题,无法重定向到文件
    21. zcat part-r-0000.gz | head -n 100 > a 
        zcat可以在不解压的情况下扩展压缩包并讲内容输出到标准输出

    18. chown -R admin:admin aaa/ 把aaa目录及目录下的所有文件修改为隶属于admin用户,admin租
    19. 查看机器cpu:cat /proc/cpuinfo
    20. 查看机器内存:free -m
    21. top查看cpu、内存占用率时,shift+o可以选择排序方式,默认是按用户名排序的
    23. 有sudo账号的情况下,想使用其他账号执行程序,比如想临时使用admin账号执行程序,可以这样:
         sudo -u admin  **.sh

         想一直使用admin账号,可以用su更好账号:sudo su admin

         退出使用exit


    24. 查看当前系统在线用户情况: w 、 who ,查看自己登录名:whoami
    25. dirname $PWD 查看当前目录的父目录
    26. sort后面不加文件的情况,默认从标准输入传入数据,使用ctrl+d终止终端输入
    27. cat file1 file2 > file3
    28. cd - 返回到上次所在的目录
    29. date -d"yesterday" +%Y%m%d 注意,+和%Y%m%d之间不能有空格
    30. unzip可以解压jar文件,unzip aa.jar -d AA
    31. 一个好用的for in 循环:
        for i in {1..100}
        do
          .......
        done

    32.vim时查看文件的编码:set fileencoding

       vim时转换文件的编码:set fileencoding=utf-8


     

    33. sudo /sbin/ldconfig
    命令解析:ldconfig是一个动态链接库管理命令

    为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig
    ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. 

    ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
     
    34.

    :

    空命令[冒号]. 这个命令意思是空操作(即什么操作也不做). 它一般被认为是和shell的内建命令true是一样的。冒号":" 命令是Bash自身内建的,它的退出状态码是真(即0)。

    1.可以用于注释:

    : '
    code1
    code2
    code3   
    '
    2.表示true

    while :
    do
     operation-1
     operation-2
     ...
      operation-n
     done
     
     等同于:
     while true
      do
          ...
      done

    3.if/then结构中作占位符

    if condition
    then :   # 什么也不做的分支
    else
        take-some-action
    fi

    4.在必须要有两元操作的地方作为一个分隔符

    : ${username=`whoami`}
     # ${username=`whoami`}   如果没有开头的:,将会出错
     #                        除非"username"是一个外部命令或是内建命令...

     

    Shell脚本while read line 损失制表符的问题

    描述:

    采用读取每行的数据,再处理的方式

    while read line

    do

    done<$file

    问题:

    但是出现一个问题:read line后line中的\t不见了,导致我awk处理时找不到\t,这时默认的分隔符是空格,可是数据本身也会有空格,就会混淆

    原因:

    查找后得知read line会过滤掉行首、行尾的空格、制表符等。

    处理办法:

    read -r line

    yum install from list

    需要使用-y参数 
    while read line
    do
    yum -y install $line
    done

     

    df -h 用m、g的数量级显示大小

    du -h --max-depth=1 ./ 显示一级目录大小

    重启crontab:

    /etc/rc.d/init.d/crond   restart

    reloadcrontab

    sudo /etc/init.d/crond reload

    35./var/log/messages 可以查看用户sudo操作等信息

    36.文件分割:split -b 12M filename 按大小分割

    split -l 12000 filename 按行分割

    合并:cat file1 >>file2

    37.使用uniq时,文件编码与终端term编码必须一致,否则uniq无效;

    38.有些应用,在rpm安装后,会自己启动。一般情况下是在/etc/rc.d/init.d/下安装一个脚本,这个脚本时被系统service调用的:如脚本名叫:ppp.sh
    则service调用如下:service ppp.sh start
    会传入参数的

     

    39.如何修改机器名并生效

    修改/etc/hosts
    增加:10.232.128.86  kgbtest128086.sqa.cm4 
    执行hostname kgbtest128086.sqa.cm4

    使用hostname或者uname -n 检查设置的hostname是否生效

    40.curl、wget都可以指定host:

    curl -H "Host:fortest.net" "http://192.9.100.10/index.php"

    41.grep 输出匹配行的前后多行

    grep -B1 -A2 "DMA" message.txt

    42 . sed -i '12,15d' filename

      删除12到15行

    43.curl http://10.222.133.62/test.php -d "asfdasdfq3wfa42342"

    使用curl模拟post方式发送数据

    --data-binary <数据> 可以发送二进制数据 

    --data-urlencode <数据> 可以发送urlencode之后的数据

    crontab的log:

    /var/log/cron*

     

    查看字符的十六进制编码:od

    在vim查看十六进制编码:%!xdd
    返回普通模式:%!xdd -r
    二进制、八进制、十六进制:
    http://longmans1985.blog.163.com/blog/static/70605475201152802851529/

     
    大家在更新环境的时候查找线上地址,一般用grep  '地址'  -r  *  的命令,这样对于压缩的js文件查找的时候就非常麻烦,打出一屏的地址;没法看出在哪个具体文件
    没有效率;
    解决的办法:grep  -no  '地址'  -r  *     
    -n参数是打印grep的地址所在行号  
    -o参数是去掉其他的内容只显示你grep的地址;
    这样去找地址很方便,很有效率
     
     
    怎样查找一个文件夹在哪个目录下

    如果只显示所在目录的路径:
    find 目录 -type d -name "查询目录名" -printf "%h\n"

    如果同时显示目录名称和所在目录的路径:
    find 目录 -type d -name "查询目录名" -printf "%p %h\n"
     
     
     

    我们有时会用到测试机发送邮件的功能,但测试机器曾出现过不能发送邮件的情况,解决办法是把iptables关掉。       执行命令:/etc/init.d/iptables stop

     
    分享几个shell命令另类用法:
    1、快速备份文件
    cp filename{,.back}
    2、清空或创建一个文件
    > 1.php
    3、实时查看某个目录下最新改动过的文件
    watch -d -n 1 'df; ls -FlAt /path'
    4、查看被占用端口的进程
    netstat -tulnp
    5、切换回上一个目录
    cat -
  • awk的学习和使用(三)

    2009-08-17 17:50:03

    先看一篇文本,名为testfile,共6个字段:site、engine、url、num1、num2、num3

    "Boharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu weet Days"      Bing    http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  0

    A.找出site、engine、url均相同的记录,将这些相同记录的num1,mum2、num3相加;

    B.找到后三个值中为0的记录,将其赋值为NULL;

    解题思路:

    第一步:排序

    第二部:求和

    第三部:判断num为0的记录,做字符串替换

    1.sort即可将其排序。注:sort testfile表示将文件中的每一行进行全排序,先从第一个字段排序,一直到最后一个字段;字段由第一个字母排序,直到最后一个字母;sort的分隔符指定参数为-t,由于本例是由第一个字段往后进行全排序,因此不需要额外指定分隔符;

    2.比较前三个字段的值并求和,用awk。由于awk默认的分隔符为tab或者空格均视为分隔符,因此根据本文的特殊性(第一个字段中包含空格),需要单独指定分隔符为tab,打印第一个字段看看:

    awk -F"\t" '{print $1}' 结果正确。

    3.字符串替换.

    3.1由于需要检查的字符串本身都是一个单独的字段(num1、num2、num3),因此可以使用awk字段判定:

    if($4=="0")$4="NULL";

    3.2另外可以使用awk的内部函数gsub来替换字符串:

    gsub(/0/,"NULL");

    这样子的结果会将每行中所有0都替换为NULL,实际我们只要求将tab后紧跟着的0替换为NULL,linux下tab可以用\<\>表示:

    gsub(/\<0\>/,"NULL"); 表示将tab后面的0替换为NULL(这个解释非常奇怪,但是结果是对的。。有待考察)

    3.3字符串替换功能,一般会使用比较简洁的sed 's/source-charactor/dest-charactor/'。其中的字符匹配支持正则表达式。

    sed 's/\t0/\tNULL'

    4.最后:

        处理问题A的awk文件:testA.awk

    BEGIN{FS="\t"}
    {if(NR==1)
    {
            site=$1;engin=$2;url=$3;n1=$4;n2=$5;n3=$6;
    }
    else if(site==$1&&engin==$2&&url==$3)
    {
            n1+=$4;n2+=$5;n3+=$6;
    }
    else
    {
            print(site"\t"engin"\t"url"\t"n1"\t"n2"\t"n3);
            site=$1;engin=$2;url=$3;n1=$4;n2=$5;n3=$6;}
    }
    END{print(site"\t"engin"\t"url"\t"n1"\t"n2"\t"n3)}

        处理问题B的awk文件:testB.awk

    BEGIN{FS="\t"}
    {
            if($4=="0")$4="NULL";
            if($5=="0")$5="NULL";
            if($6=="0")$6="NULL";
            print($1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6);
    }

    合并:

    sort testfile | awk -f testA.awk | awk -f testB.awk > out

     

  • awk的学习和使用(二)

    2009-08-14 21:08:20

    举例, test文本,内容如下,三列分别表示:电话号码、通话时间、费用。

    13911025243      1          3

    13911125274      2          6

    13911025243      3          6

    13810025274      3          6

    13911025243      2          6

    将以上文本中,每个电话号码的总通话时间、总费用进行统计;

    1.先排序:sort test

    2.将第一条记录的三个字段均保存到自定义变量,分别为:phoneNum=$1;time=$2;cost=$3;

    3.此后没读取一条记录时,$1,$2,$3与phonenum,time,cost作比较,如果phoneNum相等,则time=time+$2;cost=cost+$3;如果不相等,就打印phonenum,time,cost,并重置自定义变量值为:phoneNum=$1;time=$2;cost=$3;

    4.最后,需要在end里打印最后一次统计信息;

    实现如下:

    sort test | awk '{if(NR==1){phoneNum=$1;time=$2;cost=$3}else if($1==phoneNum){time+=$2;cost+=$3}else{print (phoneNum,time,cost);phoneNum=$1;time=$2;cost=$3;}}END{print phoneNum,time,cost}'

     

  • awk的学习和使用(一)

    2009-08-11 09:29:45

    最近接触了linux的使用和一些命令、工具的使用,awk恐怕是linux用处最广的工具之一了,今天开始,我打算记录下我的学习过程。


    一.awk的简介

    与sed和grep很相似,awk是一种样式扫描与处理工具,其功能远远强于sed和grep,除了几乎所有的sed和grep功能之外,awk还可以进行样式装入,流控制,数学运算符,进程控制语句,甚至内置的变量和函数。它具备了一个完整的语言所应具备的特性,实际上awk确实拥有自己的语言,awk程序设计语言,awk的三位创建者已将其定义为:awk样式扫描和处理语言。

    基于文本的样式扫描和处理是我们经常要做的工作,比如从一个上千行的具有一定格式的文本文件中找出满足要求的行并输出到一个新文本,就可以使用awk。再比如,监控网络时,由于网络上流动的数据非常多,如果需要获得某些特定的数据,使用awk过滤。简而言之,awk就是一个强大的文本处理工具。

    在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。

    二.awk的调用方式

    1.awk命令行的方式,适用于解决简单问题,例如:打印testfile文本中第一列为abc的所有行(省略了print)

    [root@test myself]# awk '$1==abc' testfile

    2.使用-f选项调用awk程序文件,例如:将一段awk程序保存到文本,名为testawk1,在命令行中执行该文件

    [root@test myself]# awk -f testawk1 testfile

    3.利用命令解释器调用awk,例如:将一段awk程序保存至文本,名为myawk,与前面不同的是该文本首行需要添加:#!/bin/awk -f ,保存后赋予该文件执行权限,命令行中直接调用:

    [root@test myself]# myawk testfile

    三.awk语法

    awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

    -F re : 允许awk更改其字段分隔符。

    parameter :

    'prog' : awk程序语句段,必须使用单引号‘’引起来,防止被shell解释。

    其标准形式为'pattern{action}'。前面第二节中的第一小节举例:awk '$1==abc' testfile 其中'$1==abc'就是pattern,起过滤作用,即:只有符合$1==abc的行,才执行执行{action}操作。但此例中省略了{action},此时将默认执行print操作,即打印到标准输出。

    pattern和{action}二者可以省略其中之一,但是不能两者同时省略。pattern省略时表示不对任何行进行过滤。

    {action}中的语句之间,使用;进行分隔,使用#进行注释。

    -f progfile : 允许awk调用并执行progfile文件。progfile必须是一个符合awk语法的文本文件。

    in_file : awk的输入文件。awk允许对多个输入文件进行处理,其间用,隔开,awk不会修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出。awk支持输入输出重定向。

    四.记录、字段和内置变量

    记录和字段:在awk中,缺省情况下会将文本中的一行视为一个记录,而将一行中的某一部分视作一个字段,这与数据库中对数据的处理方式类似。比如数据库中某个数据表的第一个字段名叫做ID,第二个叫做Name,在awk中使用$1、$2表示第一个字段、第二个字段。特殊的,awk用$0来表示整个行(整条记录)。

    分隔符:不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。

    内置变量:除了FS外,awk中有好几个这样的内置变量,如记录和记录之间(行与行之间)的分隔符使用RS表示,当前工作的记录数为NR等等。这些内置的变量可以在awk程序中引用或修改,例如,可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。例如,以下语句表示,显示文本文件第7行到第15行中以%分给的第1、3、7个字段值。

    awk -F % 'NR==7,NR==15 {printf $1 $3 $7}' testfile

    awk的其他内置变量:A=awk,N=nawk,P=POSIX awk。以下内置变量以系统中的帮助为准(不同系统下的awk可能有所出入)。

    P ENVIRON UNIX环境变量
    A FILENAME 当前输入文件的名字
    P FNR 当前记录数
    A FS 输入字段分隔符 空格 
    A NF 当前记录中的字段个数
    A NR 已经读出的记录数
    A OFMT 数字的输出格式 %.6g
    A OFS 输出字段分隔符 空格
    A ORS 输出的记录分隔符 新行
    A RS 输入的记录他隔符 新行

    五.内置函数

    例:显示文件myfile中的行号和第3字段:

    $awk '{printf"%03d%s\n",NR,$1}' myfile

    其中,printf即内部函数,该函数类似c++中的printf,可以对输出格式进行控制;

    例:下面的示例显示了内置变量和内置函数length()的使用:

    $awk 'length($0)>80 {print NR}' myfile

    该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符'$'。

    例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:

    #awk -F: '$2=="" {printf("%s no password!\n",$1' /etc/passwd

    在这个示例中,passwd文件的字段分隔符是“:”,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。

    其他内置函数:(以自己系统中的帮助为准)

    N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
    N index(search,string) 返回string中search串的位置
    A length(string) 求串string中的字符个数
    N match(string,reg) 返回常规表达式reg匹配的string中的位置
    N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
    N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
    N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
    G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
    N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
    A substr(string,position,len) 返回一个以position开始len个字符的子串
    P totower(string) 返回string中对应的小写字符
    P toupper(string) 返回string中对应的大写字符
    A atan(x,y) x的余切(弧度)
    N cos(x) x的余弦(弧度)
    A exp(x) e的x幂
    A int(x) x的整数部分
    A log(x) x的自然对数值
    N rand() 0-1之间的随机数
    N sin(x) x的正弦(弧度)
    A sqrt(x) x的平方根
    A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
    G system() 返回自1970年1月1日以来经过的时间(按秒计算)

    六.awk的自定义变量

    awk允许用户在awk程序语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awk保留字相同。与C语言不同的是,awk中不需要对变量进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。

    举例:

    awk '[name=$1;pwd=$2;print $1,$2]'  user.log

    说明:上例中的name、pwd均为自定义变量,不需初始化,非常简便.

  • Linux学习日志(一)---文件权限

    2009-08-04 23:24:28

    1.使用ls -l命令显示文件的详细信息,包括权限:

    yekai@kebao:/media/sda5/软件压缩/Linux$ ls -lh
    总用量 191M
    -rwxrwx--- 1 root plugdev 18M 2007-02-28 18:05 ActionCube_v0.92.tar.bz2
    -rwxrwx--- 1 root plugdev 60M 2007-04-30 22:52 nexuiz-223.zip
    -rwxrwx--- 1 root plugdev 7.4M 2007-04-25 02:16 stardict-oxford-gb-2.4.2.tar.bz2
    -rwxrwx--- 1 root plugdev 102M 2007-05-01 18:22 tremulous-1.1.0-installer.x86.run
    -rwxrwx--- 1 root plugdev 4.9M 2007-04-30 14:32 wqy-bitmapfont-0.8.1-7_all.deb.bin

    其中显示的字符表示的权限信息-rwxrwx--- 中,第一位表示是文件还是目录,第二位到第十位表示权限。

    2.权限中第一位字符的含义

    d:表示这是一个目录,事实上在ext2fs中,目录是一个特殊的文件
    -:表示这是一个普通的文件
    l:表示这是一个符号链接文件,实际上它指向另一个文件
    b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件
    s、p:这些文件关系到系统的数据结构和管道,通常很少见到

    3.权限中第二到第十位的含义

    第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限

    r(Read):对文件,具有读取文件内容的权限;对目录,具有浏览目录的权限。
    w(Write):对文件,具有新增、修改文件内容的权限;对目录,具有删除、移动目录内文件的权限。
    x(execute):对文件,具有执行文件的权限;对目录,具有进入目录的权限。


    下面举例说明:
    -rwx------: 文件所有者对文件具有读取、写入和执行的权限。
    -rwxr―-r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。
    -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
    drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。
    drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。


    4.使用chmod和数字改变文件或目录的访问权限

    文件和目录的权限表示,是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。

    r:对应数值4
    w:对应数值2
    x:对应数值1
    -:对应数值0

    解释:我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r- -则可以表示成为:111 101 100 ,再将其每三位转换成为一个十进制数,就是754。

    例如,我们想让a.txt这个文件的权限为:

     权限  自己 同组用户   其他用户
     可读  是  是  是
     可写  是  是  
     可执行      

    根据上表得到权限串为:rw-rw-r--,转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到664,因此需要执行的执行命令为:
    [root@localhost ~]# chmod 664 a.txt

    5.批量修改权限

    如果需要一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。
    例如:

    [root@localhost ~]# chmod 777 /home/user 注:仅把/home/user目录的权限设置为rwxrwxrwx
    [root@localhost ~]# chmod -R 777 /home/user 注:表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxrwxrwx

    6.使用命令chown改变目录或文件的所有权

    文件与目录不仅可以改变权限,其所有权及所属用户组也能修改,和设置权限类似,用户可以通过图形界面来设置,或执行chown命令来修改。
    我们先执行ls -l看看目录情况:

    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 root root 12172 8月 15 23:18 conkyrc.sample

    可以看到conkyrc.sample文件的所属用户组为root,所有者为root。
    执行下面命令,把conkyrc.sample文件的所有权转移到用户user:

    [root@localhost ~]# chown user conkyrc.sample
    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 user root 12172 8月 15 23:18 conkyrc.sample

    要改变所属组,可使用下面命令:

    [root@localhost ~]# chown :users conkyrc.sample
    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 user users 12172 8月 15 23:18 conkyrc.sample

    7.批量修改文件权限

    要修改目录的权限,使用-R参数就可以了,方法和前面一样。



     

  • 网络学习日志(四)--linux下的抓包工具tcpdump

    2009-07-30 17:27:18

    由于有个项目涉及到TCP、HTTP、Soap的一些东西,于是回顾了一下以前曾经学过的东西,并学到了一些新东西,以此记录。根据我的逐步学习过程,分了以下5个部分。

    1.由netstat查看网络情况,引出的TCP建立连接、终止连接过程,以及TCP状态分析;

    2.Soap=XML+HTTP引出的HTTP协议分析;

    3.Soap(Simple Object Access Protocol)简单对象访问协议分析及应用;

    4.番外一:awk的使用

    5.番外二:Linux下抓包工具

    --------------------------篇四-------------------------------------

    这篇讲linux下的抓包工具。

    抓包工具比较好用的有两个,一个是snort,一个是tcpdump,这次不说snort了,觉得这个工具虽然很强大,但是比较复杂,还是tcpdump比较简单。tcpdump windows、linux版本均有。linux版本可以在以下网站下载:www.tcpdump.org.

    安装好tcpdump之后,运行tcpdump:

    1. tcpdump -D 获取网络适配器列表,以下是在windows上获取到的结果:

    1.\Device\PssdkLoopback (PSSDK Loopback Ethernet Emulation Adapter)
    2.\Device\{CF587901-C85F-4FD6-896F-D977DEFE76EC} (Intel(R) PRO/100 VE Network Co
    nnection)

    2. tcpdump -i <需要监控的网络适配器编号>,例如我想监控lo(127.0.0.1),即上面列表中的1.\Device\PssdkLoopback: (windows上特有的,linux不适用)

    tcpdump -i 1

    如果不使用-i来定义监控适配器的话,默认使用列表中的第一个;

    3. 监控主机为192.9.200.59上8000端口的tcp协议

    tcpdump host 192.9.200.59 and tcp port 8000

    4. 如果想要显示数据包的内容,需要使用-X参数,如,我想要显示捕获的http数据包http header的内容:

    tcpdump -X host 192.9.200.59 and tcp port 8000

    显示结果如下:

    22:13:19.717472 IP testhost59.12535 > liujuan59.8000: . 1:330(329) ack 1 win 327
    8
            0x0000:  4500 0171 e616 0000 8006 cb2b 0000 0000  E..q.......+....
            0x0010:  c009 c83b 30f7 1f40 0000 0002 0000 0002  ...;0..@........
            0x0020:  5010 8000 b066 0000 504f 5354 202f 2048  P....f..POST./.H
            0x0030:  5454 502f 312e 310d 0a43 6f6e 7465 6e74  TTP/1.1..Content
            0x0040:  2d54 7970 653a 2074 6578 742f 786d 6c3b  -Type:.text/xml;
            0x0050:  2063                                     .c

    可以看到该结果只显示了http头的一部分,没有显示全,是因为tcpdump默认将显示的数据长度截断了,可以使用-s后面加数据长度,来设置数据显示长度:

    tcpdump -X -s 0 host 192.9.200.59 and tcp port 8000

    以上的例子中,-s 0 表示自动设置长度使其能够显示所有数据。

    5. 捕获的数据太多,不断刷屏,可能需要将数据内容记录到文件里,需要使用-w参数

    tcpdump -X -s 0 -w aaa host 192.9.200.59 and tcp port 8000

    则将之前显示在屏幕中的内容,写入tcpdump可执行文件同级目录下的aaa文件中。

    文件查看方式如下,需要使用-r参数:

    tcpdump -X -s 0 -r aaa host 192.9.200.59 and tcp port 8000

    如果这样写:

    tcpdump -r aaa

    则只能看到最简单的数据传输交互过程,看不到数据包内容,查看时也需要使用相应的参数。

    6.总结

    总结一下,tcpdump的参数分两个部分,选项(Options)和表达式(expression):

    tcpdump [ -adeflnNOpqRStuvxX ] [ -c count ]
                   [ -C file_size ] [ -F file ]
                   [ -i interface ] [ -m module ] [ -r file ]
                   [ -s snaplen ] [ -T type ] [ -w file ]
                   [ -E algo:secret ] [ expression ]

     

Open Toolbar