6月 06

linux 两个文件取交集命令

  有两个文件a和b,a中包含b中所有数据。需要找出a文件中包含b文件内容的数据。具体操作如下:
a.txt文件
http://www.simonzhang.net/msg?phone=12320421&msg=hfeaf
http://www.simonzhang.net/msg?phone=13219543&msg=efweff3
http://www.simonzhang.net/msg?phone=12765745&msg=f3fds
http://www.simonzhang.net/msg?phone=12432321&msg=3r2r322
http://www.simonzhang.net/msg?phone=14142142&msg=rgewo3
http://www.simonzhang.net/msg?phone=14212412&msg=iv9e
http://www.simonzhang.net/msg?phone=12321243&msg=e

b.txt文件
12320421
12432321
12321243

  查找a对b的交集命令:grep -f b.txt a.txt
结果如下:
http://www.baidu.com/msg?phone=12320421&msg=hfeaf
http://www.baidu.com/msg?phone=12432321&msg=3r2r322
http://www.baidu.com/msg?phone=12321243&msg=e

举一反三,如果要找差集命令为:grep -v -f b.txt a.txt

4月 16

linux下网络流量突然上涨问题查询

  服务器流量突然上涨,是否客户一下增多了?需要查看一下,因为数据库压力并没有增加。服务器使用的CentOS的系统,所以就用到抓包工具tcpdump。使用命令如下,在eth0的网卡上抓10万个数据包,保存在log.cap中。
# tcpdump -c 100000 -i eth0 -w log.cap &
  执行命令后台运行,并且退掉ssh,这样又避免了复杂的过滤,又不会有大量和ssh客户端的交互。(偷懒的行为)过一段时间,到服务器上把抓好的包拿下来,使用windows的上的wrieshark分析。发现了一个地址有大量连接交互,通过分析包得知,这个地址是个搜索的抓取地址,因为我们有个连接是直接跳转到下载数据包,所以这个抓取每次访问都会把整个数据包下载一边。所以造成网络流量突增。
  使用抓包工具比较麻烦,但是也不能通过统计日志里IP访问的方法来判断。因为下载只是一次访问,日志只有一条记录,所以不能更好反应增长量的问题。

TcpDump
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 数量 ] [ -C 文件尺寸 ] [ -F 文件名 ] [ -i 网络接口 ] [ -m 文件名 ] [ -r 文件名 ] [ -s 长度 ] [ -T 类型 ] [ -w 文件名 ] [ -E algo:secret ] [ 表达式

-a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd   将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。
   -n    不把网络地址转换成名字;
如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就
像这样:eth0 < ntc9.1165> router.domain.net.telnet,
使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不进行端口名称的转换。
上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp

3月 23

strace记录

ltrace用于跟踪库调用的情况,strace用于系统调用的情况,strace是ltrace的一个功能子集。
对于优化和处理问题有很大帮助。

命令格式
strace [ mid sid level ] …
mid 指定 STREAMS 模块的标识号。
sid 指定子标识号。
level 指定跟踪优先级别。

主要参数
-c — 统计对系统时间、呼叫、错误的次数
-f — 跟踪fork产生的子进程
-ff — 输出报告文件
-F — 尝试跟踪vforks
-i — 输出系统调用的入口指针.
-q — 禁止输出脱离的信息
-r — 打印每个系统调用的相对时间
-t — 在输出中的每一行前加上时间信息
-tt — 在输出中的每一行前加上时间信息,微秒级.
-T — 显示每一调用所耗的时间.
-v — 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-a column — column 设置返回值的输出位置.默认 为40.
-e expr 指定一个表达式,用来控制如何跟踪
-e trace=set 只跟踪指定的系统调用.例如:-e trace=open,close,rean,write表示只跟踪
这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的系统调用.
-e trace=ipc 跟踪所有与进程通讯有关的系统调用.
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出的数据.例如-e read=3,5
-e write=set 输出写入到指定文件中的数据.
-o file — 将strace的输出写入文件
-O overhead — set overhead for tracing syscalls to OVERHEAD usecs
-p pid — pid进程
-s strsize — 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-S sortby — 按照时间,呼叫、名字进行排序,默认使用时间(time, calls, name)
-u username — 运行所使用的用户id

输出格式

应用:
学习中还没有用过。

参考资料:
http://study.chyangwa.com/IT/AIX/aixcmds5/strace.htm#a136c1238
http://www.yuanma.org/data/2007/0201/article_2213.htm